50 #include "dev/watchdog.h"
53 #define PRINTF(...) printf(__VA_ARGS__)
55 #define PRINTF(...) do {} while (0)
58 #define SPI_FLASH_INS_WREN 0x06
59 #define SPI_FLASH_INS_WRDI 0x04
60 #define SPI_FLASH_INS_RDSR 0x05
61 #define SPI_FLASH_INS_WRSR 0x01
62 #define SPI_FLASH_INS_READ 0x03
63 #define SPI_FLASH_INS_FAST_READ 0x0b
64 #define SPI_FLASH_INS_PP 0x02
65 #define SPI_FLASH_INS_SE 0xd8
66 #define SPI_FLASH_INS_BE 0xc7
67 #define SPI_FLASH_INS_DP 0xb9
68 #define SPI_FLASH_INS_RES 0xab
78 SPI_WRITE(SPI_FLASH_INS_WREN);
85 read_status_register(
void)
94 SPI_WRITE(SPI_FLASH_INS_RDSR);
113 u = read_status_register();
123 erase_sector(
unsigned long offset)
133 SPI_WRITE_FAST(SPI_FLASH_INS_SE);
134 SPI_WRITE_FAST(offset >> 16);
135 SPI_WRITE_FAST(offset >> 8);
136 SPI_WRITE_FAST(offset >> 0);
137 SPI_WAITFORTx_ENDED();
158 SPI_WRITE_FAST(SPI_FLASH_INS_RES);
159 SPI_WAITFORTx_ENDED();
167 xmem_pread(
void *_p,
int size,
unsigned long offset)
169 unsigned char *p = _p;
170 const unsigned char *end = p + size;
175 ENERGEST_ON(ENERGEST_TYPE_FLASH_READ);
180 SPI_WRITE_FAST(SPI_FLASH_INS_READ);
181 SPI_WRITE_FAST(offset >> 16);
182 SPI_WRITE_FAST(offset >> 8);
183 SPI_WRITE_FAST(offset >> 0);
184 SPI_WAITFORTx_ENDED();
187 for(; p < end; p++) {
196 ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ);
201 static const unsigned char *
202 program_page(
unsigned long offset,
const unsigned char *p,
int nbytes)
204 const unsigned char *end = p + nbytes;
213 SPI_WRITE_FAST(SPI_FLASH_INS_PP);
214 SPI_WRITE_FAST(offset >> 16);
215 SPI_WRITE_FAST(offset >> 8);
216 SPI_WRITE_FAST(offset >> 0);
218 for(; p < end; p++) {
221 SPI_WAITFORTx_ENDED();
230 xmem_pwrite(
const void *_buf,
int size,
unsigned long addr)
232 const unsigned char *p = _buf;
233 const unsigned long end = addr + size;
234 unsigned long i, next_page;
236 ENERGEST_ON(ENERGEST_TYPE_FLASH_WRITE);
238 for(i = addr; i < end;) {
239 next_page = (i | 0xff) + 1;
240 if(next_page > end) {
243 p = program_page(i, p, next_page - i);
247 ENERGEST_OFF(ENERGEST_TYPE_FLASH_WRITE);
253 xmem_erase(
long size,
unsigned long addr)
255 unsigned long end = addr + size;
257 if(size % XMEM_ERASE_UNIT_SIZE != 0) {
258 PRINTF(
"xmem_erase: bad size\n");
262 if(addr % XMEM_ERASE_UNIT_SIZE != 0) {
263 PRINTF(
"xmem_erase: bad offset\n");
267 for (; addr < end; addr += XMEM_ERASE_UNIT_SIZE) {
static uip_ds6_addr_t * addr
Pointer to a router list entry.
static bool wait_ready(void)
Wait till previous erase/program operation completes.
static bool write_enable(void)
Enable write.
void watchdog_periodic(void)
Writes the WDT clear sequence.