From 887ff945a901fac1fe18d6be7367b7f405a99e1a Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 4 Oct 2018 14:36:34 +0000 Subject: Flash infrastructure rework based on WSPI, not complete. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12320 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/hal/lib/complex/serial_nor/serial_nor.c | 165 +++++++++++++++-------------- 1 file changed, 83 insertions(+), 82 deletions(-) (limited to 'os/hal/lib/complex/serial_nor/serial_nor.c') diff --git a/os/hal/lib/complex/serial_nor/serial_nor.c b/os/hal/lib/complex/serial_nor/serial_nor.c index b4c0970b7..3c0b2cd28 100644 --- a/os/hal/lib/complex/serial_nor/serial_nor.c +++ b/os/hal/lib/complex/serial_nor/serial_nor.c @@ -24,7 +24,7 @@ */ #include "hal.h" -#include "m25q.h" +#include "serial_nor.h" /*===========================================================================*/ /* Driver local definitions. */ @@ -38,42 +38,42 @@ /* Driver local variables and types. */ /*===========================================================================*/ -static flash_error_t m25q_read(void *instance, flash_offset_t offset, +static flash_error_t snor_read(void *instance, flash_offset_t offset, size_t n, uint8_t *rp); -static flash_error_t m25q_program(void *instance, flash_offset_t offset, +static flash_error_t snor_program(void *instance, flash_offset_t offset, size_t n, const uint8_t *pp); -static flash_error_t m25q_start_erase_all(void *instance); -static flash_error_t m25q_start_erase_sector(void *instance, +static flash_error_t snor_start_erase_all(void *instance); +static flash_error_t snor_start_erase_sector(void *instance, flash_sector_t sector); -static flash_error_t m25q_verify_erase(void *instance, +static flash_error_t snor_verify_erase(void *instance, flash_sector_t sector); -static flash_error_t m25q_query_erase(void *instance, uint32_t *msec); -static flash_error_t m25q_read_sfdp(void *instance, flash_offset_t offset, +static flash_error_t snor_query_erase(void *instance, uint32_t *msec); +static flash_error_t snor_read_sfdp(void *instance, flash_offset_t offset, size_t n, uint8_t *rp); /** * @brief Virtual methods table. */ -static const struct M25QDriverVMT m25q_vmt = { +static const struct SNORDriverVMT snor_vmt = { (size_t)0, - m25q_get_descriptor, m25q_read, m25q_program, - m25q_start_erase_all, m25q_start_erase_sector, - m25q_query_erase, m25q_verify_erase, - m25q_read_sfdp + snor_get_descriptor, snor_read, snor_program, + snor_start_erase_all, snor_start_erase_sector, + snor_query_erase, snor_verify_erase, + snor_read_sfdp }; /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ -static flash_error_t m25q_read(void *instance, flash_offset_t offset, +static flash_error_t snor_read(void *instance, flash_offset_t offset, size_t n, uint8_t *rp) { - M25QDriver *devp = (M25QDriver *)instance; + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck((instance != NULL) && (rp != NULL) && (n > 0U)); - osalDbgCheck((size_t)offset + n <= (size_t)m25q_descriptor.sectors_count * - (size_t)m25q_descriptor.sectors_size); + osalDbgCheck((size_t)offset + n <= (size_t)snor_descriptor.sectors_count * + (size_t)snor_descriptor.sectors_size); osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), "invalid state"); @@ -88,7 +88,7 @@ static flash_error_t m25q_read(void *instance, flash_offset_t offset, devp->state = FLASH_READ; /* Actual read implementation.*/ - err = m25q_device_read(devp, offset, n, rp); + err = snor_device_read(devp, offset, n, rp); /* Ready state again.*/ devp->state = FLASH_READY; @@ -99,14 +99,14 @@ static flash_error_t m25q_read(void *instance, flash_offset_t offset, return err; } -static flash_error_t m25q_program(void *instance, flash_offset_t offset, +static flash_error_t snor_program(void *instance, flash_offset_t offset, size_t n, const uint8_t *pp) { - M25QDriver *devp = (M25QDriver *)instance; + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck((instance != NULL) && (pp != NULL) && (n > 0U)); - osalDbgCheck((size_t)offset + n <= (size_t)m25q_descriptor.sectors_count * - (size_t)m25q_descriptor.sectors_size); + osalDbgCheck((size_t)offset + n <= (size_t)snor_descriptor.sectors_count * + (size_t)snor_descriptor.sectors_size); osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), "invalid state"); @@ -121,7 +121,7 @@ static flash_error_t m25q_program(void *instance, flash_offset_t offset, devp->state = FLASH_PGM; /* Actual program implementation.*/ - err = m25q_device_program(devp, offset, n, pp); + err = snor_device_program(devp, offset, n, pp); /* Ready state again.*/ devp->state = FLASH_READY; @@ -132,8 +132,8 @@ static flash_error_t m25q_program(void *instance, flash_offset_t offset, return err; } -static flash_error_t m25q_start_erase_all(void *instance) { - M25QDriver *devp = (M25QDriver *)instance; +static flash_error_t snor_start_erase_all(void *instance) { + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck(instance != NULL); @@ -151,7 +151,7 @@ static flash_error_t m25q_start_erase_all(void *instance) { devp->state = FLASH_ERASE; /* Actual erase implementation.*/ - err = m25q_device_start_erase_all(devp); + err = snor_device_start_erase_all(devp); /* Ready state again.*/ devp->state = FLASH_READY; @@ -162,13 +162,13 @@ static flash_error_t m25q_start_erase_all(void *instance) { return err; } -static flash_error_t m25q_start_erase_sector(void *instance, +static flash_error_t snor_start_erase_sector(void *instance, flash_sector_t sector) { - M25QDriver *devp = (M25QDriver *)instance; + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck(instance != NULL); - osalDbgCheck(sector < m25q_descriptor.sectors_count); + osalDbgCheck(sector < snor_descriptor.sectors_count); osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), "invalid state"); @@ -183,7 +183,7 @@ static flash_error_t m25q_start_erase_sector(void *instance, devp->state = FLASH_ERASE; /* Actual erase implementation.*/ - err = m25q_device_start_erase_sector(devp, sector); + err = snor_device_start_erase_sector(devp, sector); /* Bus released.*/ jesd216_bus_release(devp->config->busp); @@ -191,13 +191,13 @@ static flash_error_t m25q_start_erase_sector(void *instance, return err; } -static flash_error_t m25q_verify_erase(void *instance, +static flash_error_t snor_verify_erase(void *instance, flash_sector_t sector) { - M25QDriver *devp = (M25QDriver *)instance; + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck(instance != NULL); - osalDbgCheck(sector < m25q_descriptor.sectors_count); + osalDbgCheck(sector < snor_descriptor.sectors_count); osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), "invalid state"); @@ -212,7 +212,7 @@ static flash_error_t m25q_verify_erase(void *instance, devp->state = FLASH_READ; /* Actual verify erase implementation.*/ - err = m25q_device_verify_erase(devp, sector); + err = snor_device_verify_erase(devp, sector); /* Ready state again.*/ devp->state = FLASH_READY; @@ -223,8 +223,8 @@ static flash_error_t m25q_verify_erase(void *instance, return err; } -static flash_error_t m25q_query_erase(void *instance, uint32_t *msec) { - M25QDriver *devp = (M25QDriver *)instance; +static flash_error_t snor_query_erase(void *instance, uint32_t *msec) { + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck(instance != NULL); @@ -238,7 +238,7 @@ static flash_error_t m25q_query_erase(void *instance, uint32_t *msec) { jesd216_bus_acquire(devp->config->busp, devp->config->buscfg); /* Actual query erase implementation.*/ - err = m25q_device_query_erase(devp, msec); + err = snor_device_query_erase(devp, msec); /* The device is ready to accept commands.*/ if (err == FLASH_NO_ERROR) { @@ -255,9 +255,9 @@ static flash_error_t m25q_query_erase(void *instance, uint32_t *msec) { return err; } -static flash_error_t m25q_read_sfdp(void *instance, flash_offset_t offset, +static flash_error_t snor_read_sfdp(void *instance, flash_offset_t offset, size_t n, uint8_t *rp) { - M25QDriver *devp = (M25QDriver *)instance; + SNORDriver *devp = (SNORDriver *)instance; flash_error_t err; osalDbgCheck((instance != NULL) && (rp != NULL) && (n > 0U)); @@ -272,7 +272,7 @@ static flash_error_t m25q_read_sfdp(void *instance, flash_offset_t offset, jesd216_bus_acquire(devp->config->busp, devp->config->buscfg); /* Actual read SFDP implementation.*/ - err = m25q_device_read_sfdp(devp, offset, n, rp); + err = snor_device_read_sfdp(devp, offset, n, rp); /* The device is ready to accept commands.*/ if (err == FLASH_NO_ERROR) { @@ -292,15 +292,15 @@ static flash_error_t m25q_read_sfdp(void *instance, flash_offset_t offset, /** * @brief Initializes an instance. * - * @param[out] devp pointer to the @p M25QDriver object + * @param[out] devp pointer to the @p SNORDriver object * * @init */ -void m25qObjectInit(M25QDriver *devp) { +void m25qObjectInit(SNORDriver *devp) { osalDbgCheck(devp != NULL); - devp->vmt = &m25q_vmt; + devp->vmt = &snor_vmt; devp->state = FLASH_STOP; devp->config = NULL; } @@ -308,12 +308,12 @@ void m25qObjectInit(M25QDriver *devp) { /** * @brief Configures and activates N25Q128 driver. * - * @param[in] devp pointer to the @p M25QDriver object + * @param[in] devp pointer to the @p SNORDriver object * @param[in] config pointer to the configuration * * @api */ -void m25qStart(M25QDriver *devp, const M25QConfig *config) { +void m25qStart(SNORDriver *devp, const SNORConfig *config) { osalDbgCheck((devp != NULL) && (config != NULL)); osalDbgAssert(devp->state != FLASH_UNINIT, "invalid state"); @@ -326,7 +326,7 @@ void m25qStart(M25QDriver *devp, const M25QConfig *config) { jesd216_bus_acquire(devp->config->busp, devp->config->buscfg); /* Device identification and initialization.*/ - m25q_device_init(devp); + snor_device_init(devp); /* Driver in ready state.*/ devp->state = FLASH_READY; @@ -339,11 +339,11 @@ void m25qStart(M25QDriver *devp, const M25QConfig *config) { /** * @brief Deactivates the N25Q128 driver. * - * @param[in] devp pointer to the @p M25QDriver object + * @param[in] devp pointer to the @p SNORDriver object * * @api */ -void m25qStop(M25QDriver *devp) { +void m25qStop(SNORDriver *devp) { osalDbgCheck(devp != NULL); osalDbgAssert(devp->state != FLASH_UNINIT, "invalid state"); @@ -368,51 +368,52 @@ void m25qStop(M25QDriver *devp) { } #if (JESD216_BUS_MODE != JESD216_BUS_MODE_SPI) || defined(__DOXYGEN__) -#if (QSPI_SUPPORTS_MEMMAP == TRUE) || defined(__DOXYGEN__) +#if (WSPI_SUPPORTS_MEMMAP == TRUE) || defined(__DOXYGEN__) /** * @brief Enters the memory Mapping mode. - * @details The memory mapping mode is only available when the QSPI mode - * is selected and the underlying QSPI controller supports the + * @details The memory mapping mode is only available when the WSPI mode + * is selected and the underlying WSPI controller supports the * feature. * - * @param[in] devp pointer to the @p M25QDriver object + * @param[in] devp pointer to the @p SNORDriver object * @param[out] addrp pointer to the memory start address of the mapped * flash or @p NULL * * @api */ -void m25qMemoryMap(M25QDriver *devp, uint8_t **addrp) { - qspi_command_t cmd; +void m25qMemoryMap(SNORDriver *devp, uint8_t **addrp) { + wspi_command_t cmd; /* Bus acquisition.*/ jesd216_bus_acquire(devp->config->busp, devp->config->buscfg); /* Activating XIP mode in the device.*/ - m25q_activate_xip(devp); - - /* Putting the QSPI driver in memory mapped mode.*/ - cmd.cfg = QSPI_CFG_CMD(M25Q_CMD_FAST_READ) | - QSPI_CFG_ADDR_SIZE_24 | -#if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L - QSPI_CFG_CMD_MODE_ONE_LINE | - QSPI_CFG_ADDR_MODE_ONE_LINE | - QSPI_CFG_DATA_MODE_ONE_LINE | -#elif JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI2L - QSPI_CFG_CMD_MODE_TWO_LINES | - QSPI_CFG_ADDR_MODE_TWO_LINES | - QSPI_CFG_DATA_MODE_TWO_LINES | + snor_activate_xip(devp); + + /* Putting the WSPI driver in memory mapped mode. + TODO: Put this in the device code.*/ + cmd.cmd = N25Q_CMD_FAST_READ; + cmd.dummy = SNOR_READ_DUMMY_CYCLES - 2; + cmd.cfg = WSPI_CFG_ADDR_SIZE_24 | +#if JESD216_BUS_MODE == JESD216_BUS_MODE_WSPI1L + WSPI_CFG_CMD_MODE_ONE_LINE | + WSPI_CFG_ADDR_MODE_ONE_LINE | + WSPI_CFG_DATA_MODE_ONE_LINE | +#elif JESD216_BUS_MODE == JESD216_BUS_MODE_WSPI2L + WSPI_CFG_CMD_MODE_TWO_LINES | + WSPI_CFG_ADDR_MODE_TWO_LINES | + WSPI_CFG_DATA_MODE_TWO_LINES | #else - QSPI_CFG_CMD_MODE_FOUR_LINES | - QSPI_CFG_ADDR_MODE_FOUR_LINES | - QSPI_CFG_DATA_MODE_FOUR_LINES | + WSPI_CFG_CMD_MODE_FOUR_LINES | + WSPI_CFG_ADDR_MODE_FOUR_LINES | + WSPI_CFG_DATA_MODE_FOUR_LINES | #endif - QSPI_CFG_ALT_MODE_FOUR_LINES | /* Always 4 lines, note.*/ - QSPI_CFG_ALT_SIZE_8 | - QSPI_CFG_SIOO | - QSPI_CFG_DUMMY_CYCLES(M25Q_READ_DUMMY_CYCLES - 2); + WSPI_CFG_ALT_MODE_FOUR_LINES | /* Always 4 lines, note.*/ + WSPI_CFG_ALT_SIZE_8 | + WSPI_CFG_SIOO; - /* Starting QSPI memory mapped mode.*/ - qspiMapFlash(devp->config->busp, &cmd, addrp); + /* Starting WSPI memory mapped mode.*/ + wspiMapFlash(devp->config->busp, &cmd, addrp); /* Bus release.*/ jesd216_bus_release(devp->config->busp); @@ -421,24 +422,24 @@ void m25qMemoryMap(M25QDriver *devp, uint8_t **addrp) { /** * @brief Leaves the memory Mapping mode. * - * @param[in] devp pointer to the @p M25QDriver object + * @param[in] devp pointer to the @p SNORDriver object * * @api */ -void m25qMemoryUnmap(M25QDriver *devp) { +void m25qMemoryUnmap(SNORDriver *devp) { /* Bus acquisition.*/ jesd216_bus_acquire(devp->config->busp, devp->config->buscfg); - /* Stopping QSPI memory mapped mode.*/ - qspiUnmapFlash(devp->config->busp); + /* Stopping WSPI memory mapped mode.*/ + wspiUnmapFlash(devp->config->busp); - m25q_reset_xip(devp); + snor_reset_xip(devp); /* Bus release.*/ jesd216_bus_release(devp->config->busp); } -#endif /* QSPI_SUPPORTS_MEMMAP == TRUE */ +#endif /* WSPI_SUPPORTS_MEMMAP == TRUE */ #endif /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */ /** @} */ -- cgit v1.2.3