diff options
Diffstat (limited to 'src/br24t_eeprom_driver.c')
-rw-r--r-- | src/br24t_eeprom_driver.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/br24t_eeprom_driver.c b/src/br24t_eeprom_driver.c new file mode 100644 index 0000000..53165d3 --- /dev/null +++ b/src/br24t_eeprom_driver.c @@ -0,0 +1,62 @@ +#include <stdio.h> +#include "i2c.h" +#include "br24t_eeprom_driver.h" + +#define EEPROM_ADDR 0x57 +#define EEPROM_PAGE_SIZE 64 + +//for burning eeprom +#define MAGIC_SYN 0xdeadbeef +#define MAGIC_ACK 0xf00dd00d + +#define PAGE_WRITE_OK 0x00 +#define PAGE_WRITE_CORRUPTED 0x01 +#define PAGE_WRITE_UNKNOWN_ERROR 0xff + +//we need another function cause it's got a 16 bit register address + +#ifdef FLASH_EEPROM +void flash_eeprom() { + uint16_t data_len; + uint32_t syn = 0; + uint8_t on_byte; + uint8_t eeprom_buffer_out[EEPROM_PAGE_SIZE]; + uint8_t eeprom_buffer_in[EEPROM_PAGE_SIZE]; + + while(syn != MAGIC_SYN) fread(&syn, 4, 1, stdin); //not sure we _really_ need to do this? + + //this feels ugly + syn = MAGIC_ACK; + fwrite(&syn, 4, 1, stdout); + + //get amount of data we'll be using + data_len = uart_recvbyte(); + data_len |= (uart_recvbyte() >> 8); + + for(int page = 0; page < (data_len / EEPROM_PAGE_SIZE); data_len -= EEPROM_PAGE_SIZE) { + + fread(eeprom_buffer_out, EEPROM_PAGE_SIZE, 1, stdin); + + i2c_start(EEPROM_I2C_ADDR, I2C_READ); + i2c_send((uint8_t)(page * EEPROM_PAGE_SIZE) & 0xff); + i2c_send((uint8_t)(page * EEPROM_PAGE_SIZE) >> 8); + for(on_byte = 0; on_byte < EEPROM_PAGE_SIZE; on_byte++) + i2c_send(eeprom_buffer_out[on_byte]); + i2c_stop(); + + //verify + eeprom_buffer_in[0] = EEPROM_READBYTE(page * EEPROM_PAGE_SIZE); + //eeprom_buffer_in[0] = i2c_read_reg_addr16(EEPROM_I2C_ADDR, page * EEPROM_PAGE_SIZE); + i2c_start(EEPROM_I2C_ADDR, I2C_READ); + for(on_byte = 1; on_byte < EEPROM_PAGE_SIZE; on_byte++) + eeprom_buffer_in[on_byte] = i2c_recv(); + i2c_stop(); + + if(memcmp(eeprom_buffer_in, eeprom_buffer_out, EEPROM_PAGE_SIZE)) { + fputc(PAGE_WRITE_CORRUPTED, stdout); + error(); + } + fputc(PAGE_WRITE_OK, stdout); + } +} +#endif |