00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00045 #include <cfg/eeprom.h>
00046 #include <cfg/memory.h>
00047
00048 #include <dev/board.h>
00049 #include <dev/spi_at45d.h>
00050
00051 #include <sys/nutdebug.h>
00052
00053 #include <stdlib.h>
00054 #include <string.h>
00055 #include <memdebug.h>
00056
00057 #include <dev/nvmem_at45d.h>
00058
00059 static NUTDEVICE *devSysConf;
00060
00071 static int SpiAt45dConfigDevice(void)
00072 {
00073 #if !defined(DEV_SPIBUS)
00074 return -1;
00075 #else
00076 if (devSysConf == NULL) {
00077 NUTSPINODE *node;
00078 NUTDEVICE *dev;
00079 #if NUT_CONFIG_AT45D == 0
00080 dev = &devSpiAt45d0;
00081 #elif NUT_CONFIG_AT45D == 1
00082 dev = &devSpiAt45d1;
00083 #elif NUT_CONFIG_AT45D == 2
00084 dev = &devSpiAt45d2;
00085 #elif NUT_CONFIG_AT45D == 3
00086 dev = &devSpiAt45d3;
00087 #else
00088 return -1;
00089 #endif
00090 node = (NUTSPINODE *) dev->dev_icb;
00091 NUTASSERT(node != NULL);
00092 if (node->node_bus == NULL) {
00093 NUTSPIBUS *bus;
00094 bus = &DEV_SPIBUS;
00095 node->node_bus = bus;
00096 }
00097 #ifdef NUT_CONFIG_AT45D_CS
00098 node->node_cs = NUT_CONFIG_AT45D_CS;
00099 #endif
00100 NUTASSERT(node->node_bus->bus_initnode != NULL);
00101 if ((*node->node_bus->bus_initnode) (node)) {
00102 return -1;
00103 }
00104 NutEventPost(&node->node_bus->bus_mutex);
00105 if (SpiAt45dInit(dev)) {
00106 return -1;
00107 }
00108 devSysConf = dev;
00109 }
00110 return 0;
00111 #endif
00112 }
00113
00114 static uint32_t SpiAt45dConfigPage(void)
00115 {
00116 #ifdef NUT_CONFIG_AT45D_PAGE
00117 return NUT_CONFIG_AT45D_PAGE;
00118 #else
00119 return SpiAt45dPages(devSysConf) - 1;
00120 #endif
00121 }
00122
00134 size_t SpiAt45dConfigSize(void)
00135 {
00136 int rc = 0;
00137
00138 if (SpiAt45dConfigDevice() == 0) {
00139 #ifdef NUT_CONFIG_AT45D_SIZE
00140 rc = NUT_CONFIG_AT45D_SIZE;
00141 NUTASSERT(NUT_CONFIG_AT45D_SIZE <= SpiAt45dPageSize(devSysConf));
00142 #else
00143 rc = (size_t) SpiAt45dPageSize(devSysConf);
00144 #endif
00145 }
00146 return rc;
00147 }
00148
00158 int SpiAt45dConfigRead(size_t pos, void *data, size_t len)
00159 {
00160 int rc = -1;
00161 uint8_t *buff;
00162 int csize = SpiAt45dConfigSize();
00163
00164
00165 if (csize >= pos + len && (buff = malloc(csize)) != NULL) {
00166 uint32_t cpage = SpiAt45dConfigPage();
00167
00168 if (SpiAt45dPageRead(devSysConf, cpage, buff, csize) == csize) {
00169
00170 memcpy(data, buff + pos, len);
00171 rc = 0;
00172 }
00173 free(buff);
00174 }
00175 return rc;
00176 }
00177
00187 int SpiAt45dConfigWrite(size_t pos, CONST void *data, size_t len)
00188 {
00189 int rc = -1;
00190 uint8_t *buff;
00191 int csize = SpiAt45dConfigSize();
00192
00193
00194 if (csize >= pos + len && (buff = malloc(csize)) != NULL) {
00195 uint32_t cpage = SpiAt45dConfigPage();
00196
00197 if (SpiAt45dPageRead(devSysConf, cpage, buff, csize) == csize) {
00198
00199 if (memcmp(buff + pos, data, len)) {
00200
00201 memcpy(buff + pos, data, len);
00202
00203 if (SpiAt45dPageWrite(devSysConf, cpage, buff, csize) == csize) {
00204 rc = 0;
00205 }
00206 } else {
00207 rc = 0;
00208 }
00209 }
00210 free(buff);
00211 }
00212 return rc;
00213 }