aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-06-05 08:05:25 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-06-05 08:05:25 +0000
commit07d81aae52dc92707aa732de75baf8b9fa5988b5 (patch)
treeb37c79271a06373b4ff2686c5bb2387099ebca2e
parent63f5989cd28e0ffd997b9d599c0d96b6402f5aa5 (diff)
downloadChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.tar.gz
ChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.tar.bz2
ChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.zip
Better abstracted flash bus code.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9581 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/ex/Micron/m25q.c18
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.c75
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.h66
3 files changed, 101 insertions, 58 deletions
diff --git a/os/ex/Micron/m25q.c b/os/ex/Micron/m25q.c
index cd399181a..a8fcf1d92 100644
--- a/os/ex/Micron/m25q.c
+++ b/os/ex/Micron/m25q.c
@@ -648,15 +648,13 @@ void m25qStart(M25QDriver *devp, const M25QConfig *config) {
/* Bus acquisition.*/
jesd216_bus_acquire(devp->config->busp);
-#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
- /* SPI initialization.*/
- spiStart(devp->config->busp, devp->config->buscfg);
+ /* Starting bus device.*/
+ jesd216_start(devp->config->busp, devp->config->buscfg);
+#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
/* Reading device ID.*/
-#else /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
- /* QSPI initialization.*/
- qspiStart(devp->config->busp, devp->config->buscfg);
+#else /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
/* Attempting a reset of the XIP mode, it could be in an unexpected state
because a CPU reset does not reset the memory too.*/
m25q_reset_xip(devp);
@@ -740,12 +738,10 @@ void m25qStop(M25QDriver *devp) {
/* Bus acquisition.*/
jesd216_bus_acquire(devp->config->busp);
-#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
- spiStop(devp->config->busp);
-#else
- qspiStop(devp->config->busp);
-#endif
+ /* Stopping bus device.*/
+ jesd216_stop(devp->config->busp);
+ /* Deleting current configuration.*/
devp->config = NULL;
/* Driver stopped.*/
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);