#include "board.h" #include "sfud.h" #include "snfud.h" #include "mmcsd_core.h" /** * read flash data * * @param flash flash device * @param addr start address * @param size read size * @param data read data pointer * * @return result */ int flash_read(uint32_t addr, size_t size, uint8_t *data) { #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH static sfud_flash *sflash = NULL; if (!sflash) { sflash = sfud_get_device(0); } return sfud_read(sflash, addr, size, data); #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH static sfud_flash *snflash = NULL; if (!snflash) { snflash = snfud_get_device(0); } return snfud_read(snflash, addr, size, data); #else return emmc_read(addr, size, data); #endif } /** * write flash data (no erase operate) * * @param flash flash device * @param addr start address * @param data write data * @param size write size * * @return result */ int flash_write(uint32_t addr, size_t size, const uint8_t *data) { #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH static sfud_flash *sflash = NULL; if (!sflash) { sflash = sfud_get_device(0); } return sfud_write(sflash, addr, size, data); #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH static sfud_flash *snflash = NULL; if (!snflash) { snflash = snfud_get_device(0); } return snfud_write(snflash, addr, size, data); #else return emmc_write(addr, size, (uint8_t *)data); #endif } /** * erase and write flash data * * @param flash flash device * @param addr start address * @param size write size * @param data write data * * @return result */ int flash_erase_write(uint32_t addr, size_t size, const uint8_t *data) { #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH static sfud_flash *sflash = NULL; if (!sflash) { sflash = sfud_get_device(0); } return sfud_erase_write(sflash, addr, size, data); #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH static sfud_flash *snflash = NULL; if (!snflash) { snflash = snfud_get_device(0); } return snfud_erase_write(snflash, addr, size, data); #else return emmc_write(addr, size, (uint8_t *)data); #endif } /** * erase flash data * * @note It will erase align by erase granularity. * * @param flash flash device * @param addr start address * @param size erase size * * @return result */ int flash_erase(uint32_t addr, size_t size) { #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH static sfud_flash *sflash = NULL; if (!sflash) { sflash = sfud_get_device(0); } return sfud_erase(sflash, addr, size); #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH static sfud_flash *snflash = NULL; if (!snflash) { snflash = snfud_get_device(0); } return snfud_erase(snflash, addr, size); #else return 0; #endif }