/*---------------------------------------------------------------------------*/ static const char * program_page(unsigned long offset, const unsigned char *p, int nbytes) { const unsigned char *end = p + nbytes; int s; wait_ready(); write_enable(); s = splhigh(); SPI_FLASH_ENABLE(); FASTSPI_TX(SPI_FLASH_INS_PP); FASTSPI_TX(offset >> 16); /* MSB */ FASTSPI_TX(offset >> 8); FASTSPI_TX(offset >> 0); /* LSB */ for(; p < end; p++) { FASTSPI_TX(~*p); } SPI_WAITFORTx_ENDED(); SPI_FLASH_DISABLE(); splx(s); return p; }
/*---------------------------------------------------------------------------*/ int xmem_pread(void *_p, int size, unsigned long offset) { unsigned char *p = _p; const unsigned char *end = p + size; int s; wait_ready(); ENERGEST_ON(ENERGEST_TYPE_FLASH_READ); s = splhigh(); SPI_FLASH_ENABLE(); FASTSPI_TX(SPI_FLASH_INS_READ); FASTSPI_TX(offset >> 16); /* MSB */ FASTSPI_TX(offset >> 8); FASTSPI_TX(offset >> 0); /* LSB */ SPI_WAITFORTx_ENDED(); FASTSPI_CLEAR_RX(); for(; p < end; p++) { unsigned char u; FASTSPI_RX(u); *p = ~u; } SPI_FLASH_DISABLE(); splx(s); ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ); return size; }
/*---------------------------------------------------------------------------*/ static void write_enable(void) { int s; s = splhigh(); SPI_FLASH_ENABLE(); FASTSPI_TX(SPI_FLASH_INS_WREN); SPI_WAITFORTx_ENDED(); SPI_FLASH_DISABLE(); splx(s); }
/* * Erase 64k bytes of data. It takes about 1s before WIP goes low! */ static void erase_sector(unsigned long offset) { int s; wait_ready(); write_enable(); s = splhigh(); SPI_FLASH_ENABLE(); FASTSPI_TX(SPI_FLASH_INS_SE); FASTSPI_TX(offset >> 16); /* MSB */ FASTSPI_TX(offset >> 8); FASTSPI_TX(offset >> 0); /* LSB */ SPI_WAITFORTx_ENDED(); SPI_FLASH_DISABLE(); splx(s); }
/*---------------------------------------------------------------------------*/ static unsigned read_status_register(void) { unsigned char u; int s; s = splhigh(); SPI_FLASH_ENABLE(); FASTSPI_TX(SPI_FLASH_INS_RDSR); SPI_WAITFORTx_ENDED(); FASTSPI_CLEAR_RX(); FASTSPI_RX(u); SPI_FLASH_DISABLE(); splx(s); return u; }
/*---------------------------------------------------------------------------*/ static void spi_tx(unsigned byte) { FASTSPI_TX(byte); }