summaryrefslogtreecommitdiff
path: root/firmware/eeprom.c
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2011-10-11 21:56:36 +0200
committerYves Fischer <yvesf-git@xapek.org>2011-10-11 21:56:36 +0200
commitcbc941282074856fc6179761b70a0c9879b0b64d (patch)
treeed15c6d9e20ceaf1ff01a05aa63054410bb8ed54 /firmware/eeprom.c
parent324c5ba9098c1010d0aa8c1e26b95509878ce9f2 (diff)
downloadmini-octopus-cbc941282074856fc6179761b70a0c9879b0b64d.tar.gz
mini-octopus-cbc941282074856fc6179761b70a0c9879b0b64d.zip
update firmware to @319
Diffstat (limited to 'firmware/eeprom.c')
-rw-r--r--firmware/eeprom.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/firmware/eeprom.c b/firmware/eeprom.c
new file mode 100644
index 0000000..3f0c1a1
--- /dev/null
+++ b/firmware/eeprom.c
@@ -0,0 +1,119 @@
+#include "common.h"
+#include "protocol.h"
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/eeprom.h>
+#include <stdio.h>
+
+#include "eeprom.h"
+#include "debug.h"
+
+#define EEPROM_READY() while(EECR & (1 << EEWE));
+
+void eeprom_parser(char *buf)
+{
+ uint16_t addr;
+ uint16_t length;
+
+ addr = ((uint16_t)buf[2]) +
+ ((uint16_t)buf[3] << 8);
+
+ length = ((uint16_t)buf[4]) +
+ ((uint16_t)buf[5] << 8);
+
+ debugf("eeprom_parser: length: %u, addr: %u\n", length, addr);
+
+ switch(buf[0])
+ {
+ case CMD_EEPROM_READ_BYTES:
+ eeprom_read_bytes_usb(addr, length);
+ break;
+
+ case CMD_EEPROM_WRITE_BYTES:
+ eeprom_write_bytes_usb(addr, &buf[6], length);
+ break;
+
+ default:
+ answer[0] = buf[0];
+ answer[1] = RSP_UNKOWN_CMD;
+ answer[2] = 0;
+ CommandAnswer(3);
+ }
+}
+
+
+void eeprom_read_bytes_usb(uint16_t addr, uint16_t length)
+{
+ answer[0] = CMD_EEPROM_READ_BYTES;
+ answer[1] = eeprom_read_bytes(addr, (char *)&answer[2], length);
+ answer[2+length] = 0;
+
+ debugf("read: %s\n", &answer[2]);
+
+ CommandAnswer(3+length);
+}
+
+uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length)
+{
+ uint8_t i;
+
+ if(addr > MAX_ADDR)
+ return RSP_ERROR;
+
+ // wait for eeprom
+ EEPROM_READY();
+
+ for(i = 0; i < length; i++)
+ {
+
+ buf[i] = eeprom_read_byte((uint8_t*) addr++);
+ // set addr
+ //EEAR = addr++;
+
+ //EECR |= (1 << EERE);
+
+ //buf[i] = EEDR;
+ //debug_SendHex(buf[i]);
+ }
+
+ return RSP_OK;
+}
+
+void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length)
+{
+ answer[0] = CMD_EEPROM_WRITE_BYTES;
+ answer[1] = eeprom_write_bytes(addr, buf, length);
+ answer[2] = 0;
+
+ debugf("written: %s\n", buf);
+
+ CommandAnswer(3);
+}
+
+uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length)
+{
+ uint8_t i;
+
+ if(addr > MAX_ADDR)
+ return RSP_ERROR;
+
+ // wait for eeprom
+ EEPROM_READY();
+
+ for(i = 0; i < length; i++)
+ {
+ eeprom_write_byte ((uint8_t*) addr++, buf[i]);
+
+ //EEAR = addr++;
+ //EEDR = buf[i];
+
+ //EECR |= (1 << EEMWE);
+ //EECR |= (1 << EEWE);
+ }
+
+ eeprom_read_bytes(addr, buf, length);
+
+ return RSP_OK;
+}