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);
83 read_status_register(
void)
93 SPI_WRITE(SPI_FLASH_INS_RDSR);
112 u = read_status_register();
122 erase_sector(
unsigned long offset)
132 SPI_WRITE_FAST(SPI_FLASH_INS_SE);
133 SPI_WRITE_FAST(offset >> 16);
134 SPI_WRITE_FAST(offset >> 8);
135 SPI_WRITE_FAST(offset >> 0);
136 SPI_WAITFORTx_ENDED();
150 P4DIR |= BV(FLASH_CS);
151 P5DIR |= BV(FLASH_HOLD);
158 xmem_pread(
void *_p,
int size,
unsigned long offset)
160 unsigned char *p = _p;
161 const unsigned char *end = p + size;
168 SPI_WRITE_FAST(SPI_FLASH_INS_READ);
169 SPI_WRITE_FAST(offset >> 16);
170 SPI_WRITE_FAST(offset >> 8);
171 SPI_WRITE_FAST(offset >> 0);
172 SPI_WAITFORTx_ENDED();
175 for(; p < end; p++) {
187 static const unsigned char *
188 program_page(
unsigned long offset,
const unsigned char *p,
int nbytes)
190 const unsigned char *end = p + nbytes;
200 SPI_WRITE_FAST(SPI_FLASH_INS_PP);
201 SPI_WRITE_FAST(offset >> 16);
202 SPI_WRITE_FAST(offset >> 8);
203 SPI_WRITE_FAST(offset >> 0);
205 for(; p < end; p++) {
208 SPI_WAITFORTx_ENDED();
217 xmem_pwrite(
const void *_buf,
int size,
unsigned long addr)
219 const unsigned char *p = _buf;
220 const unsigned long end = addr + size;
221 unsigned long i, next_page;
223 for(i = addr; i < end;) {
224 next_page = (i | 0xff) + 1;
225 if(next_page > end) {
228 p = program_page(i, p, next_page - i);
236 xmem_erase(
long size,
unsigned long addr)
238 unsigned long end = addr + size;
240 if(size % XMEM_ERASE_UNIT_SIZE != 0) {
241 PRINTF(
"xmem_erase: bad size\n");
245 if(addr % XMEM_ERASE_UNIT_SIZE != 0) {
246 PRINTF(
"xmem_erase: bad offset\n");
250 for (; addr < end; addr += XMEM_ERASE_UNIT_SIZE) {
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
static bool write_enable(const spi_device_t *flash_spi_configuration)
Enable write.
static bool wait_ready(const spi_device_t *flash_spi_configuration)
Wait till previous erase/program operation completes.
void watchdog_periodic(void)
Writes the WDT clear sequence.