48#include "dev/watchdog.h"
51#define PRINTF(...) printf(__VA_ARGS__)
53#define PRINTF(...) do {} while (0)
56#define SPI_FLASH_INS_WREN 0x06
57#define SPI_FLASH_INS_WRDI 0x04
58#define SPI_FLASH_INS_RDSR 0x05
59#define SPI_FLASH_INS_WRSR 0x01
60#define SPI_FLASH_INS_READ 0x03
61#define SPI_FLASH_INS_FAST_READ 0x0b
62#define SPI_FLASH_INS_PP 0x02
63#define SPI_FLASH_INS_SE 0xd8
64#define SPI_FLASH_INS_BE 0xc7
65#define SPI_FLASH_INS_DP 0xb9
66#define SPI_FLASH_INS_RES 0xab
76 SPI_WRITE(SPI_FLASH_INS_WREN);
83read_status_register(
void)
92 SPI_WRITE(SPI_FLASH_INS_RDSR);
111 u = read_status_register();
121erase_sector(
unsigned long offset)
131 SPI_WRITE_FAST(SPI_FLASH_INS_SE);
132 SPI_WRITE_FAST(offset >> 16);
133 SPI_WRITE_FAST(offset >> 8);
134 SPI_WRITE_FAST(offset >> 0);
135 SPI_WAITFORTx_ENDED();
150 P4DIR |= BV(FLASH_CS) | BV(FLASH_HOLD) | BV(FLASH_PWR);
151 P4OUT |= BV(FLASH_PWR);
156 SPI_WRITE_FAST(SPI_FLASH_INS_RES);
157 SPI_WAITFORTx_ENDED();
167 unsigned char *p = _p;
168 const unsigned char *end = p + size;
176 SPI_WRITE_FAST(SPI_FLASH_INS_READ);
177 SPI_WRITE_FAST(offset >> 16);
178 SPI_WRITE_FAST(offset >> 8);
179 SPI_WRITE_FAST(offset >> 0);
180 SPI_WAITFORTx_ENDED();
183 for(; p < end; p++) {
195static const unsigned char *
196program_page(
unsigned long offset,
const unsigned char *p,
int nbytes)
198 const unsigned char *end = p + nbytes;
207 SPI_WRITE_FAST(SPI_FLASH_INS_PP);
208 SPI_WRITE_FAST(offset >> 16);
209 SPI_WRITE_FAST(offset >> 8);
210 SPI_WRITE_FAST(offset >> 0);
212 for(; p < end; p++) {
215 SPI_WAITFORTx_ENDED();
226 const unsigned char *p = _buf;
227 const unsigned long end =
addr + size;
228 unsigned long i, next_page;
230 for(i =
addr; i < end;) {
231 next_page = (i | 0xff) + 1;
232 if(next_page > end) {
235 p = program_page(i, p, next_page - i);
245 unsigned long end =
addr + size;
247 if(size % XMEM_ERASE_UNIT_SIZE != 0) {
248 PRINTF(
"xmem_erase: bad size\n");
252 if(
addr % XMEM_ERASE_UNIT_SIZE != 0) {
253 PRINTF(
"xmem_erase: bad offset\n");
257 for (;
addr < end;
addr += XMEM_ERASE_UNIT_SIZE) {
void watchdog_periodic(void)
Writes the WDT clear sequence.
void xmem_init(void)
Initialize the external memory.
int xmem_erase(long size, unsigned long addr)
Erase a sector in the flash memory.
int xmem_pwrite(const void *_buf, int size, unsigned long addr)
int xmem_pread(void *_p, int size, unsigned long addr)
Read a number of bytes from an offset in the external memory.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Header file to the external flash memory (XMem) API.