From 07d81aae52dc92707aa732de75baf8b9fa5988b5 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 5 Jun 2016 08:05:25 +0000 Subject: Better abstracted flash bus code. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9581 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/lib/peripherals/flash/hal_jesd216_flash.c | 75 +++++++++++++++++------- os/hal/lib/peripherals/flash/hal_jesd216_flash.h | 66 ++++++++++++--------- 2 files changed, 94 insertions(+), 47 deletions(-) (limited to 'os/hal/lib/peripherals') diff --git a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c index 07d4aad80..53f458c03 100644 --- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c +++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c @@ -46,7 +46,25 @@ /* Driver exported functions. */ /*===========================================================================*/ -void jesd216_cmd(BUSDriver *busp, uint8_t cmd) { +void jesd216_start(BUSDriver *busp, const BUSConfig *config) { + +#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI + spiStart(busp, config); +#else + qspiStart(busp, config); +#endif +} + +void jesd216_stop(BUSDriver *busp) { + +#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI + spiStop(busp); +#else + qspiStop(busp); +#endif +} + +void jesd216_cmd(BUSDriver *busp, uint32_t cmd) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI qspi_command_t mode; @@ -72,7 +90,7 @@ void jesd216_cmd(BUSDriver *busp, uint8_t cmd) { } void jesd216_cmd_receive(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, size_t n, uint8_t *p) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI @@ -105,7 +123,7 @@ void jesd216_cmd_receive(BUSDriver *busp, } void jesd216_cmd_send(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, size_t n, const uint8_t *p) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI @@ -138,7 +156,7 @@ void jesd216_cmd_send(BUSDriver *busp, } void jesd216_cmd_addr(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, flash_address_t addr) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI qspi_command_t mode; @@ -175,31 +193,36 @@ void jesd216_cmd_addr(BUSDriver *busp, } void jesd216_cmd_addr_send(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, flash_address_t addr, size_t n, const uint8_t *p) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI qspi_command_t mode; - mode.cfg = QSPI_CFG_CMD(cmd) | + mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) | #if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L QSPI_CFG_CMD_MODE_ONE_LINE | QSPI_CFG_ADDR_MODE_ONE_LINE | - QSPI_CFG_ADDR_SIZE_24 | 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_ADDR_SIZE_24 | QSPI_CFG_DATA_MODE_TWO_LINES; #else QSPI_CFG_CMD_MODE_FOUR_LINES | QSPI_CFG_ADDR_MODE_FOUR_LINES | - QSPI_CFG_ADDR_SIZE_24 | QSPI_CFG_DATA_MODE_FOUR_LINES; - #endif + + /* Handling 32 bits addressing.*/ + if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) { + mode .cfg |= QSPI_CFG_ADDR_SIZE_24; + } + else { + mode .cfg |= QSPI_CFG_ADDR_SIZE_32; + } + mode.addr = addr; mode.alt = 0U; qspiSend(busp, &mode, n, p); @@ -218,18 +241,17 @@ void jesd216_cmd_addr_send(BUSDriver *busp, } void jesd216_cmd_addr_receive(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, flash_address_t addr, size_t n, uint8_t *p) { #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI qspi_command_t mode; - mode.cfg = QSPI_CFG_CMD(cmd) | + mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) | #if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L QSPI_CFG_CMD_MODE_ONE_LINE | QSPI_CFG_ADDR_MODE_ONE_LINE | - QSPI_CFG_ADDR_SIZE_24 | QSPI_CFG_DATA_MODE_ONE_LINE; #elif JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI2L QSPI_CFG_CMD_MODE_TWO_LINES | @@ -239,10 +261,17 @@ void jesd216_cmd_addr_receive(BUSDriver *busp, #else QSPI_CFG_CMD_MODE_FOUR_LINES | QSPI_CFG_ADDR_MODE_FOUR_LINES | - QSPI_CFG_ADDR_SIZE_24 | QSPI_CFG_DATA_MODE_FOUR_LINES; - #endif + + /* Handling 32 bits addressing.*/ + if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) { + mode .cfg |= QSPI_CFG_ADDR_SIZE_24; + } + else { + mode .cfg |= QSPI_CFG_ADDR_SIZE_32; + } + mode.addr = addr; mode.alt = 0U; qspiReceive(busp, &mode, n, p); @@ -262,33 +291,39 @@ void jesd216_cmd_addr_receive(BUSDriver *busp, #if (JESD216_BUS_MODE != JESD216_BUS_MODE_SPI) || defined(__DOXYGEN__) void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, - uint8_t cmd, + uint32_t cmd, flash_address_t addr, uint8_t dummy, size_t n, uint8_t *p) { qspi_command_t mode; - mode.cfg = QSPI_CFG_CMD(cmd) | + mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) | #if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L QSPI_CFG_CMD_MODE_ONE_LINE | QSPI_CFG_ADDR_MODE_ONE_LINE | - QSPI_CFG_ADDR_SIZE_24 | QSPI_CFG_DUMMY_CYCLES(dummy) | 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_ADDR_SIZE_24 | QSPI_CFG_DUMMY_CYCLES(dummy) | QSPI_CFG_DATA_MODE_TWO_LINES; #else QSPI_CFG_CMD_MODE_FOUR_LINES | QSPI_CFG_ADDR_MODE_FOUR_LINES | - QSPI_CFG_ADDR_SIZE_24 | QSPI_CFG_DUMMY_CYCLES(dummy) | QSPI_CFG_DATA_MODE_FOUR_LINES; #endif + + /* Handling 32 bits addressing.*/ + if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) { + mode .cfg |= QSPI_CFG_ADDR_SIZE_24; + } + else { + mode .cfg |= QSPI_CFG_ADDR_SIZE_32; + } + mode.addr = addr; mode.alt = 0U; qspiReceive(busp, &mode, n, p); diff --git a/os/hal/lib/peripherals/flash/hal_jesd216_flash.h b/os/hal/lib/peripherals/flash/hal_jesd216_flash.h index 69d8a8533..bb2214e81 100644 --- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.h +++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.h @@ -35,29 +35,36 @@ * @name Common command codes * @{ */ -#define JESD216_CMD_READ_ID 0x9F -#define JESD216_CMD_READ 0x03 -#define JESD216_CMD_WRITE_ENABLE 0x06 -#define JESD216_CMD_WRITE_DISABLE 0x04 -#define JESD216_CMD_READ_STATUS_REGISTER 0x05 -#define JESD216_CMD_WRITE_STATUS_REGISTER 0x01 -#define JESD216_CMD_PAGE_PROGRAM 0x02 -#define JESD216_CMD_ERASE_4K 0x20 -#define JESD216_CMD_ERASE_BULK 0xC7 -#define JESD216_CMD_PROGRAM_ERASE_RESUME 0x7A -#define JESD216_CMD_PROGRAM_ERASE_SUSPEND 0x75 -#define JESD216_CMD_READ_OTP_ARRAY 0x4B -#define JESD216_CMD_PROGRAM_OTP_ARRAY 0x42 +#define JESD216_CMD_READ_ID 0x9FU +#define JESD216_CMD_READ 0x03U +#define JESD216_CMD_WRITE_ENABLE 0x06U +#define JESD216_CMD_WRITE_DISABLE 0x04U +#define JESD216_CMD_READ_STATUS_REGISTER 0x05U +#define JESD216_CMD_WRITE_STATUS_REGISTER 0x01U +#define JESD216_CMD_PAGE_PROGRAM 0x02U +#define JESD216_CMD_ERASE_4K 0x20U +#define JESD216_CMD_ERASE_BULK 0xC7U +#define JESD216_CMD_PROGRAM_ERASE_RESUME 0x7AU +#define JESD216_CMD_PROGRAM_ERASE_SUSPEND 0x75U +#define JESD216_CMD_READ_OTP_ARRAY 0x4BU +#define JESD216_CMD_PROGRAM_OTP_ARRAY 0x42U +/** @} */ + +/** + * @name Command options + * @{ + */ +#define JESD216_CMD_EXTENDED_ADDRESSING 0x80000000U /** @} */ /** * @name Bus interface. * @{ */ -#define JESD216_BUS_MODE_SPI 0 -#define JESD216_BUS_MODE_QSPI1L 1 -#define JESD216_BUS_MODE_QSPI2L 2 -#define JESD216_BUS_MODE_QSPI4L 4 +#define JESD216_BUS_MODE_SPI 0U +#define JESD216_BUS_MODE_QSPI1L 1U +#define JESD216_BUS_MODE_QSPI2L 2U +#define JESD216_BUS_MODE_QSPI4L 4U /** @} */ /*===========================================================================*/ @@ -184,17 +191,22 @@ typedef struct { #ifdef __cplusplus extern "C" { #endif - void jesd216_cmd(BUSDriver *busp, uint8_t cmd); - void jesd216_cmd_receive(BUSDriver *busp, uint8_t cmd, size_t n, uint8_t *p); - void jesd216_cmd_send(BUSDriver *busp, uint8_t cmd, size_t n, const uint8_t *p); - void jesd216_cmd_addr(BUSDriver *busp, uint8_t cmd, flash_address_t addr); - void jesd216_cmd_addr_send(BUSDriver *busp, uint8_t cmd, flash_address_t addr, - size_t n, const uint8_t *p); - void jesd216_cmd_addr_receive(BUSDriver *busp, uint8_t cmd, flash_address_t addr, - size_t n, uint8_t *p); + void jesd216_start(BUSDriver *busp, const BUSConfig *config); + void jesd216_stop(BUSDriver *busp); + void jesd216_cmd(BUSDriver *busp, uint32_t cmd); + void jesd216_cmd_receive(BUSDriver *busp, uint32_t cmd, + size_t n, uint8_t *p); + void jesd216_cmd_send(BUSDriver *busp, uint32_t cmd, + size_t n, const uint8_t *p); + void jesd216_cmd_addr(BUSDriver *busp, uint32_t cmd, flash_address_t addr); + void jesd216_cmd_addr_send(BUSDriver *busp, uint32_t cmd, + flash_address_t addr, size_t n, const uint8_t *p); + void jesd216_cmd_addr_receive(BUSDriver *busp, uint32_t cmd, + flash_address_t addr, size_t n, uint8_t *p); #if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI - void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, uint8_t cmd, flash_address_t addr, - uint8_t dummy, size_t n, uint8_t *p); + void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, uint32_t cmd, + flash_address_t addr, uint8_t dummy, + size_t n, uint8_t *p); #endif /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */ #if JESD216_SHARED_BUS == TRUE void jesd216_bus_acquire(BUSDriver *busp); -- cgit v1.2.3