int write_buff(flash_info_t *info, uchar *src, ulong dst, ulong len) { uint32_t val; dst = dst - CFG_FLASH_BASE; printf("write len: %lu dst: 0x%x src: %p\n", len, dst, src); for (; len; len--, dst++, src++) { ar7240_spi_write_enable(); // dont move this above 'for' ar7240_spi_bit_banger(AR7240_SPI_CMD_PAGE_PROG); ar7240_spi_send_addr(dst); val = *src & 0xff; ar7240_spi_bit_banger(val); ar7240_spi_go(); ar7240_spi_poll(); } /* * Disable the Function Select * Without this we can't read from the chip again */ ar7240_reg_wr(AR7240_SPI_FS, 0); if (len) { // how to differentiate errors ?? return ERR_PROG_ERROR; } else { return ERR_OK; } }
static void ar7240_spi_sector_erase(uint32_t addr){ ar7240_spi_write_enable(); ar7240_spi_bit_banger(AR7240_SPI_CMD_SECTOR_ERASE); ar7240_spi_send_addr(addr); ar7240_spi_go(); ar7240_spi_poll(); }
static void ar7240_spi_erase_64k(uint32_t addr){ ar7240_spi_write_enable(); ar7240_spi_bit_banger(AR7240_SPI_CMD_BLOCK_ERASE); ar7240_spi_send_addr(addr); ar7240_spi_go(); ar7240_spi_poll(); }
void ar7240_spi_flash_unblock(void) { ar7240_spi_write_enable(); ar7240_spi_bit_banger(AR7240_SPI_CMD_WRITE_SR); ar7240_spi_bit_banger(0x0); ar7240_spi_go(); ar7240_spi_poll(); }
void ar7240_spi_flash_chip_erase(void) { ar7240_spi_write_enable(); ar7240_spi_bit_banger(AR7240_SPI_CMD_CHIP_ERASE); ar7240_spi_go(); ar7240_spi_poll(); }
static void ar7240_spi_write_page(uint32_t addr, uint8_t *data, int len){ int i; uint8_t ch; ar7240_spi_write_enable(); ar7240_spi_bit_banger(AR7240_SPI_CMD_PAGE_PROG); ar7240_spi_send_addr(addr); for(i = 0; i < len; i++){ ch = *(data + i); ar7240_spi_bit_banger(ch); } ar7240_spi_go(); ar7240_spi_poll(); }