/* EEPROM routines */
/* Designed by Paolo Subiaco http://www.creasol.it */

#include "main.h"
#include "eeprom.h"
#include "i2c.h"

#if EEPROM <= 2402
void eepromWrite(uchar address, void *ptr, uchar size) {
#else
void eepromWrite(uint address, void *ptr, uchar size) {
#endif
	uchar *chptr=(uchar*)ptr;
	uchar retry=50;
	#ifdef DEBUGEEPROM
	_eei=0;	// disable external interrupt
	#endif
	while (size) {
		I2C_START();
#ifdef EEPROM_PAGE_ADDRESS
		I2C_WRITE(0xa0);
#else
		I2C_WRITE(0xa0|((address>>7)&0x0e)); // A2,A1,A0
#endif		
		// test acknowledg
		if (EEPROMACK==0) {
			I2C_STOP();
			retry--;
			if (retry==0) {
				// error trying to write to EEPROM: busy
				#ifdef DEBUGEEPROM
				_eei=1;	// reenable external interrupt
				#endif
				return;
			}
			goto eepromWriteWait;
		}
#ifdef EEPROM_PAGE_ADDRESS
		I2C_WRITE(address>>8); // page address
#endif
		I2C_WRITE((uchar)address);
		do {
			I2C_WRITE(*chptr);
			chptr++;
			address++;
			size--;
			if (size==0) break;
		} while (address&(EEPROM_PLEN-1));
		I2C_STOP();
eepromWriteWait:		
		msleep(6);
	}
	// Ok, writing eeprom correctly
	EEPROMACK=1;
	#ifdef DEBUGEEPROM
	_eei=1;	// reenable external interrupt
	#endif
	return;
}

#if EEPROM <= 2402
void eepromRead(uchar address, void *ptr, uchar size) {
#else
void eepromRead(uint address, void *ptr, uchar size) {
#endif
	uchar *chptr=(uchar*)ptr;
	uchar retry=50;
	while (retry) {
		I2C_START();
#ifdef EEPROM_PAGE_ADDRESS
		I2C_WRITE(0xa0);
#else
		I2C_WRITE(0xa0|((address>>7)&0x0e)); // A2,A1,A0
#endif		
		if (EEPROMACK==0) {
			I2C_STOP();
			retry--;
			if (retry==0) {
				// error trying to write to EEPROM: busy
				return;
			}
			msleep(6);
		} else {
			break;
		}
	}
#ifdef EEPROM_PAGE_ADDRESS
	I2C_WRITE(address>>8); // page address
#endif
	I2C_WRITE((uchar)address);
	I2C_START();
#ifdef EEPROM_PAGE_ADDRESS
	I2C_WRITE(0xa1);
#else
	I2C_WRITE(0xa1|((address>>7)&0x0e)); // A2,A1,A0
#endif		
	while (size) {
		*chptr=I2C_READ(size==1?NACK:ACK);
		size--;
		chptr++;
	}
	I2C_STOP();	// Silly bug!
	EEPROMACK=1;
	return;
}

					
