47 #include "cfs-coffee-arch.h"
51 #include "dev/watchdog.h"
54 #define PRINTF(...) printf(__VA_ARGS__)
56 #define PRINTF(...) do {} while (0)
61 #define SPI_WRITE(data) \
63 SPIX_WAITFORTxREADY(FLASH_SPI_INSTANCE); \
64 SPIX_BUF(FLASH_SPI_INSTANCE) = data; \
65 SPIX_WAITFOREOTx(FLASH_SPI_INSTANCE); \
70 #define SPI_WRITE_FAST(data) \
72 SPIX_WAITFORTxREADY(FLASH_SPI_INSTANCE); \
73 SPIX_BUF(FLASH_SPI_INSTANCE) = data; \
77 #define SPI_READ(data) \
79 SPIX_BUF(FLASH_SPI_INSTANCE) = 0; \
80 SPIX_WAITFOREORx(FLASH_SPI_INSTANCE); \
81 data = SPIX_BUF(FLASH_SPI_INSTANCE); \
85 #define SPI_FLUSH() SPIX_FLUSH(FLASH_SPI_INSTANCE)
87 #define SPI_FLASH_ENABLE() SPIX_CS_CLR(FLASH_CSN_PORT, FLASH_CSN_PIN)
88 #define SPI_FLASH_DISABLE() SPIX_CS_SET(FLASH_CSN_PORT, FLASH_CSN_PIN)
90 #define SPI_WAITFORTx_ENDED() SPIX_WAITFOREOTx(FLASH_SPI_INSTANCE)
92 #define SPI_FLASH_INS_WREN 0x06
93 #define SPI_FLASH_INS_WRDI 0x04
94 #define SPI_FLASH_INS_RDSR 0x05
95 #define SPI_FLASH_INS_WRSR 0x01
96 #define SPI_FLASH_INS_READ 0x03
97 #define SPI_FLASH_INS_FAST_READ 0x0b
98 #define SPI_FLASH_INS_PP 0x02
99 #define SPI_FLASH_INS_SE 0xd8
100 #define SPI_FLASH_INS_BE 0xc7
101 #define SPI_FLASH_INS_DP 0xb9
102 #define SPI_FLASH_INS_RES 0xab
110 SPI_WRITE(SPI_FLASH_INS_WREN);
117 read_status_register(
void)
125 SPI_WRITE(SPI_FLASH_INS_RDSR);
144 u = read_status_register();
154 erase_sector(
unsigned long offset)
163 SPI_WRITE_FAST(SPI_FLASH_INS_SE);
164 SPI_WRITE_FAST(offset >> 16);
165 SPI_WRITE_FAST(offset >> 8);
166 SPI_WRITE_FAST(offset >> 0);
167 SPI_WAITFORTx_ENDED();
189 xmem_pread(
void *_p,
int size,
unsigned long offset)
191 unsigned char *p = _p;
192 const unsigned char *end = p + size;
196 ENERGEST_ON(ENERGEST_TYPE_FLASH_READ);
201 SPI_WRITE_FAST(SPI_FLASH_INS_READ);
202 SPI_WRITE_FAST(offset >> 16);
203 SPI_WRITE_FAST(offset >> 8);
204 SPI_WRITE_FAST(offset >> 0);
205 SPI_WAITFORTx_ENDED();
208 for(; p < end; p++) {
217 ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ);
222 static const unsigned char *
223 program_page(
unsigned long offset,
const unsigned char *p,
int nbytes)
225 const unsigned char *end = p + nbytes;
234 SPI_WRITE_FAST(SPI_FLASH_INS_PP);
235 SPI_WRITE_FAST(offset >> 16);
236 SPI_WRITE_FAST(offset >> 8);
237 SPI_WRITE_FAST(offset >> 0);
239 for(; p < end; p++) {
242 SPI_WAITFORTx_ENDED();
252 xmem_pwrite(
const void *_buf,
int size,
unsigned long addr)
254 const unsigned char *p = _buf;
255 const unsigned long end = addr + size;
256 unsigned long i, next_page;
258 ENERGEST_ON(ENERGEST_TYPE_FLASH_WRITE);
260 for(i = addr; i < end;) {
261 next_page = (i | 0xff) + 1;
262 if(next_page > end) {
265 p = program_page(i, p, next_page - i);
269 ENERGEST_OFF(ENERGEST_TYPE_FLASH_WRITE);
275 xmem_erase(
long size,
unsigned long addr)
277 unsigned long end = addr + size;
279 if(size % XMEM_ERASE_UNIT_SIZE != 0) {
280 PRINTF(
"xmem_erase: bad size\n");
284 if(addr % XMEM_ERASE_UNIT_SIZE != 0) {
285 PRINTF(
"xmem_erase: bad offset\n");
289 for (; addr < end; addr += XMEM_ERASE_UNIT_SIZE) {
Header file with definitions related to the I/O connections on the Muntjac platform, cc2538-based.
static uip_ds6_addr_t * addr
Pointer to a router list entry.
Header file for the cc2538 SPI driver, including macros for the implementation of the low-level SPI p...
static bool wait_ready(void)
Wait till previous erase/program operation completes.
static bool write_enable(void)
Enable write.
void spix_init(uint8_t spi)
Initialize the SPI bus for the instance given.
void spix_cs_init(uint8_t port, uint8_t pin)
Configure a GPIO to be the chip select pin.
void watchdog_periodic(void)
Writes the WDT clear sequence.
Header file for the cc2538 Synchronous Serial Interface.
#define INTERRUPTS_DISABLE()
Disables all CPU interrupts.
#define INTERRUPTS_ENABLE()
Enables all CPU interrupts.