From 77ea39c0dfe2fb48118b5a876e914e4bc93d9ea4 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sat, 7 May 2016 15:44:55 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9447 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/ex/Micron/n25q128.c | 56 +++++++++++++++++++++++++++++--- os/ex/Micron/n25q128.h | 2 +- os/hal/lib/peripherals/flash/hal_flash.h | 6 ++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/os/ex/Micron/n25q128.c b/os/ex/Micron/n25q128.c index 53e54aecd..6107dafff 100644 --- a/os/ex/Micron/n25q128.c +++ b/os/ex/Micron/n25q128.c @@ -62,15 +62,63 @@ static const struct N25Q128DriverVMT n25q128_vmt = { /* Driver local variables and types. */ /*===========================================================================*/ +static flash_descriptor_t descriptor = { + .attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_REWRITABLE, + .page_size = 256, + .sectors_count = 4096, + .sectors = NULL, + .sectors_size = 4096, + .address = 0 +}; + /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ +static void spi_send_cmd_read(N25Q128Driver *devp, uint8_t cmd, + uint8_t *rp, size_t n) { + +#if N25Q128_SHARED_SPI == TRUE + spiStart(devp->config->spip, devp->config->spicfg); + spiAcquireBus(devp->config->spip); +#endif + spiSelect(devp->config->spip); + spiSend(devp->config->spip, 1, &cmd); + spiReceive(devp->config->spip, n, rp); + spiUnselect(devp->config->spip); +#if N25Q128_SHARED_SPI == TRUE + spiReleaseBus(devp->config->spip); +#endif +} + +static void spi_send_cmd_addr_read(N25Q128Driver *devp, + uint8_t cmd, + flash_address_t addr, + uint8_t *rp, size_t n) { + uint8_t buf[4]; + +#if N25Q128_SHARED_SPI == TRUE + spiStart(devp->config->spip, devp->config->spicfg); + spiAcquireBus(devp->config->spip); +#endif + buf[0] = cmd; + buf[1] = (uint8_t)(addr >> 16); + buf[2] = (uint8_t)(addr >> 8); + buf[3] = (uint8_t)(addr >> 0); + spiSelect(devp->config->spip); + spiSend(devp->config->spip, 4, buf); + spiReceive(devp->config->spip, n, rp); + spiUnselect(devp->config->spip); +#if N25Q128_SHARED_SPI == TRUE + spiReleaseBus(devp->config->spip); +#endif +} + static const flash_descriptor_t *get_attributes(void *instance) { (void)instance; - return FLASH_NO_ERROR; + return &descriptor; } static flash_error_t erase_all(void *instance) { @@ -116,10 +164,8 @@ static flash_error_t program(void *instance, flash_address_t addr, static flash_error_t read(void *instance, flash_address_t addr, uint8_t *rp, size_t n) { - (void)instance; - (void)addr; - (void)rp; - (void)n; + spi_send_cmd_addr_read((N25Q128Driver *)instance, N25Q128_CMD_READ, + addr, rp, n); return FLASH_NO_ERROR; } diff --git a/os/ex/Micron/n25q128.h b/os/ex/Micron/n25q128.h index e0f301a30..bdc500463 100644 --- a/os/ex/Micron/n25q128.h +++ b/os/ex/Micron/n25q128.h @@ -82,7 +82,7 @@ * @note The default is @p FALSE. Requires SPI_USE_MUTUAL_EXCLUSION */ #if !defined(N25Q128_SHARED_SPI) || defined(__DOXYGEN__) -#define N25Q128_SHARED_SPI FALSE +#define N25Q128_SHARED_SPI TRUE #endif /** @} */ diff --git a/os/hal/lib/peripherals/flash/hal_flash.h b/os/hal/lib/peripherals/flash/hal_flash.h index 9905abb2a..736fbb201 100644 --- a/os/hal/lib/peripherals/flash/hal_flash.h +++ b/os/hal/lib/peripherals/flash/hal_flash.h @@ -36,6 +36,7 @@ #define FLASH_ATTR_ERASED_IS_ONE 0x00000001 #define FLASH_ATTR_MEMORY_MAPPED 0x00000002 #define FLASH_ATTR_REWRITABLE 0x00000004 +#define FLASH_ATTR_READ_ECC_CAPABLE 0x00000008 /** @} */ /*===========================================================================*/ @@ -57,8 +58,9 @@ typedef enum { FLASH_NO_ERROR = 0, /* No error. */ FLASH_PARAMETER_ERROR = 1, /* Error in a function parameter. */ FLASH_ADDRESS_ERROR = 2, /* Operation overlaps invalid addresses. */ - FLASH_VERIFY_FAILURE = 3, /* Write or erase operation failed. */ - FLASH_HW_FAILURE = 4 /* Controller or communication error. */ + FLASH_ECC_ERROR = 3, /* ECC error during read operation. */ + FLASH_VERIFY_FAILURE = 4, /* Write or erase operation failed. */ + FLASH_HW_FAILURE = 5 /* Controller or communication error. */ } flash_error_t; /** -- cgit v1.2.3