2424#define EEPROM_OFFSET 0x00001000
2525#define CTRL_REG 0xb0000018
2626
27- #define EEPROM_SIZE 2048 // EEPROM size in bytes
27+ #define EEPROM_SIZE 512 // EEPROM size in dwords
2828
2929
3030#include < inttypes.h>
@@ -54,17 +54,22 @@ class CurieEEPROM
5454 // Functionality to 'get' and 'put' objects to and from EEPROM.
5555 template < typename T > T &get (uint32_t addr, T &t)
5656 {
57- // make sure address is valid
58- if (( addr > 0x7FC ) || (addr% 4 ) )
57+ // make sure address is within valid range
58+ if (addr > 0x1FF )
5959 {
6060 return t;
6161 }
62+
6263 int byteCount = sizeof (T);
63- // return if size of object is greater than size of EEPROM
64- if (byteCount > EEPROM_SIZE )
64+ // return if object size is too big
65+ if (addr + byteCount > 0x7FC )
6566 {
6667 return t;
6768 }
69+
70+ // allign address to 32-bit addressing
71+ addr*=sizeof (uint32_t );
72+
6873 byte *bytes = to_bytes (t);
6974 for (int i = 0 ; i < byteCount; i++)
7075 {
@@ -76,15 +81,16 @@ class CurieEEPROM
7681 }
7782 template < typename T > T put (uint32_t addr, T t)
7883 {
79- // make sure address is valid
80- if (( addr > 0x7FC ) || (addr% 4 ) )
84+ // make sure address is within valid range
85+ if (addr > 0x1FF )
8186 {
8287 return t;
8388 }
8489 uint32_t rom_wr_ctrl = 0 ;
8590 int byteCount = sizeof (T);
86- // return if size of object is greater than size of EEPROM
87- if (byteCount > EEPROM_SIZE)
91+
92+ // return if object size is too big
93+ if (addr + byteCount > 0x7FC )
8894 {
8995 return t;
9096 }
@@ -96,7 +102,7 @@ class CurieEEPROM
96102 bool blockAvailable = true ;
97103 for (int i =0 ; i < size; i++)
98104 {
99- uint32_t data32 = read (addr+i* sizeof ( uint32_t ) );
105+ uint32_t data32 = read (addr+i);
100106 if (data32 != 0xFFFFFFFF )
101107 {
102108 blockAvailable = false ;
@@ -106,7 +112,7 @@ class CurieEEPROM
106112 {
107113 for (int i = 0 ; i<size; i++)
108114 {
109- write (addr+i* sizeof ( uint32_t ) , dwords[i]);
115+ write (addr+i, dwords[i]);
110116 }
111117 }
112118 else
0 commit comments