summaryrefslogtreecommitdiff
path: root/src/backup
diff options
context:
space:
mode:
authorBrett Weiland <brett_weiland@bpcsapce.com>2023-01-12 13:41:48 -0600
committerBrett Weiland <brett_weiland@bpcsapce.com>2023-01-12 13:41:48 -0600
commitb666668d0e6b67e4632e65486cae814ab5abbc39 (patch)
tree0cf0c2d689799c5e98d505e632248fdc5ed5a072 /src/backup
parent94304b11e7220f060dbc345de5fa1952d0465016 (diff)
updating for linkedin
Diffstat (limited to 'src/backup')
-rw-r--r--src/backup89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/backup b/src/backup
new file mode 100644
index 0000000..a90b206
--- /dev/null
+++ b/src/backup
@@ -0,0 +1,89 @@
+#include <avr/io.h>
+#include <stdio.h>
+#include <string.h>
+#include <util/delay.h>
+#include "i2c.h"
+#include "br24t_eeprom_driver.h"
+#include "uart.h"
+#include "pins.h"
+#include "debug.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
+
+
+#ifdef FLASH_EEPROM
+int main() {
+ LED_DEBUG_DDR |= _BV(LED_DEBUG); //TODO move to debug file or somethin
+ LED_DEBUG_PORT &= ~(_BV(LED_DEBUG));
+ i2c_init();
+
+ uart_debug_init();
+ FILE stdout_replacement = FDEV_SETUP_STREAM((void *)uart_debug_sendbyte, NULL, _FDEV_SETUP_WRITE);
+ FILE stdin_replacement = FDEV_SETUP_STREAM(NULL, (void *)uart_debug_recvbyte, _FDEV_SETUP_READ);
+ stdout = &stdout_replacement;
+ stdin = &stdin_replacement;
+
+ printf("booted\r\n");
+ flash_eeprom();
+ return 0;
+
+}
+
+void flash_eeprom() {
+ unsigned int page_len;
+ unsigned int on_byte;
+ uint8_t eeprom_buffer_out[EEPROM_PAGE_SIZE];
+ uint8_t eeprom_buffer_in[EEPROM_PAGE_SIZE];
+
+ /**
+ FILE master_in = FDEV_SETUP_STREAM((void *)uart_flash_sendbyte, NULL, _FDEV_SETUP_WRITE);
+ FILE master_out = FDEV_SETUP_STREAM(NULL, (void *)uart_flash_recvbyte, _FDEV_SETUP_READ);
+ **/
+ FILE master_f = FDEV_SETUP_STREAM((void *)uart_flash_sendbyte, NULL, _FDEV_SETUP_WRITE);
+
+ printf("waiting for master\r\n");
+
+ fread(&page_len, 1, 1, master_out);
+ printf("%i pages total\r\n", page_len);
+
+ for(int page = 0; page < page_len; page++) {
+ printf("writing page %i...\r\n", page);
+
+
+ fread(eeprom_buffer_out, EEPROM_PAGE_SIZE, 1, &master_in);
+ fputc(PAGE_WRITE_CORRUPTED, &master_out);
+
+
+ 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, &master_out);
+ printf("invalid checksum on page %i!", page);
+ }
+ fputc(PAGE_WRITE_OK, &master_out);
+ }
+ printf("If you ever read this, you should be happy\r\n");
+}
+#endif