5
Created by Marek Michalkiewicz <marekm@linux.org.pl>
7
THIS SOFTWARE IS NOT COPYRIGHTED
9
This source code is offered for use in the public domain. You may
10
use, modify or distribute it freely.
12
This code is distributed in the hope that it will be useful, but
13
WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
14
DISCLAIMED. This includes but is not limited to warranties of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21
/* the same library is used for 2313 and 8515 for now -
22
I hope writing 0 to non-existent EEARH doesn't hurt... */
24
#define EEARH (EEARL+1)
33
/* read one byte from EEPROM */
34
/* unsigned char eeprom_rb(unsigned int addr); */
35
/* addr = r25:r24, result = r25(=0):r24 */
42
rjmp _U(eeprom_rb) /* make sure EEPROM is ready */
48
clr res_hi /* gcc wants result extended to "int"? */
51
#endif /* L_eeprom_rb */
54
/* read a little endian 16-bit word from EEPROM */
55
/* unsigned int eeprom_rw(unsigned int addr); */
56
/* addr = r25:r24, result = r25:r24 */
62
rjmp _U(eeprom_rw) /* make sure EEPROM is ready */
75
mov res_lo, __tmp_reg__
78
#endif /* L_eeprom_rw */
81
/* write a byte to EEPROM */
82
/* void eeprom_wb(unsigned int addr, unsigned char val); */
83
/* addr = r25:r24, val = r22 */
90
rjmp _U(eeprom_wb) /* make sure EEPROM is ready */
97
cli ; /* no ints between setting EEMWE and EEWE */
100
out SREG, __tmp_reg__
103
#endif /* L_eeprom_wb */
117
#ifdef L_eeprom_read_block
118
/* read a block of bytes from EEPROM */
119
/* void eeprom_read_block(void *buf, unsigned int addr, size_t n); */
120
/* buf = r25:r24, addr = r23:r22, n = r21:r20 */
122
.global _U(eeprom_read_block)
124
_U(eeprom_read_block):
125
cp n_lo, __zero_reg__
126
cpc n_hi, __zero_reg__
127
breq eeprom_read_block_done
128
LOAD_X(buf_lo, buf_hi)
129
eeprom_read_block_busy:
131
rjmp eeprom_read_block_busy /* make sure EEPROM is ready */
132
eeprom_read_block_loop:
138
subi addr_lo, lo8(-1)
139
sbci addr_hi, hi8(-1)
144
brne eeprom_read_block_loop
145
eeprom_read_block_done:
147
#endif /* L_eeprom_read_block */