diff options
| author | Keith Packard <keithp@keithp.com> | 2012-10-18 15:18:52 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-10-18 15:18:52 -0700 | 
| commit | 5a55501660ebab3b858a48483c5df1cfb4e858e4 (patch) | |
| tree | 9b5d8305d9c65b10f82f6839bb1b5c169681ef00 /src/attiny/ao_eeprom_tiny.c | |
| parent | 0361235c9ef56738ba0e97be88a85afef0ce8268 (diff) | |
| parent | 440365bd17d804c2f574c35164612cf1682397d7 (diff) | |
Merge branch 'master' into mm-ms5611
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/attiny/ao_eeprom_tiny.c')
| -rw-r--r-- | src/attiny/ao_eeprom_tiny.c | 71 | 
1 files changed, 71 insertions, 0 deletions
| diff --git a/src/attiny/ao_eeprom_tiny.c b/src/attiny/ao_eeprom_tiny.c new file mode 100644 index 00000000..83014183 --- /dev/null +++ b/src/attiny/ao_eeprom_tiny.c @@ -0,0 +1,71 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <ao.h> + +static void +ao_eeprom_wait(void) +{ +	/* Wait for previous write to complete */ +	while (EECR & (1 << EEPE)) +		; +} + +static uint8_t +ao_eeprom_read_byte(uint16_t addr) +{ +	uint8_t	v; + +	ao_eeprom_wait(); +	EEAR = addr; +	cli(); +	EECR |= (1 << EERE); +	v = EEDR; +	sei(); +	return v; +} + +static void +ao_eeprom_write_byte(uint16_t addr, uint8_t v) +{ +	ao_eeprom_wait(); +	EECR = (0 << EEPM1) | (0 << EEPM0); +	EEAR = addr; +	EEDR = v; +	cli(); +	EECR |= (1 << EEMPE); +	EECR |= (1 << EEPE); +	sei(); +} + +void +ao_eeprom_read(uint16_t addr, void *buf, uint16_t len) +{ +	uint8_t	*b = buf; + +	while (len--) +		*b++ = ao_eeprom_read_byte(addr++); +} + +void +ao_eeprom_write(uint16_t addr, void *buf, uint16_t len) +{ +	uint8_t	*b = buf; + +	while (len--) +		ao_eeprom_write_byte(addr++, *b++); +} | 
