diff options
author | Giovanni Di Sirio <gdisirio@gmail.com> | 2018-11-09 09:57:16 +0000 |
---|---|---|
committer | Giovanni Di Sirio <gdisirio@gmail.com> | 2018-11-09 09:57:16 +0000 |
commit | 9472504bb695fef7f68849847ffe40dff9b0a591 (patch) | |
tree | f26590d3c6f97ef1264631726aeccdf7344819a4 | |
parent | 8e0e4b064425c9c54e109191bba8bcf0775ba9ee (diff) | |
download | ChibiOS-9472504bb695fef7f68849847ffe40dff9b0a591.tar.gz ChibiOS-9472504bb695fef7f68849847ffe40dff9b0a591.tar.bz2 ChibiOS-9472504bb695fef7f68849847ffe40dff9b0a591.zip |
WSPI and flash support improvements.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12411 110e8d01-0319-4d1e-a829-52ad28d1bb01
6 files changed, 166 insertions, 181 deletions
diff --git a/os/hal/include/hal_wspi.h b/os/hal/include/hal_wspi.h index c54c9ca2a..c3f2ac248 100644 --- a/os/hal/include/hal_wspi.h +++ b/os/hal/include/hal_wspi.h @@ -200,6 +200,11 @@ typedef struct { #define WSPI_CFG_DQS_ENABLE (1LU << 29LU)
#define WSPI_CFG_SIOO (1LU << 31LU)
+
+#define WSPI_CFG_ALL_DTR (WSPI_CFG_CMD_DTR | \
+ WSPI_CFG_ADDR_DTR | \
+ WSPI_CFG_ALT_DTR | \
+ WSPI_CFG_DATA_DTR)
/** @} */
#endif /* WSPI_USE_DEFAULT_CFG_MASKS == TRUE */
diff --git a/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.c b/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.c index 81a15f869..176a7d524 100644 --- a/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.c +++ b/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.c @@ -69,38 +69,19 @@ const wspi_command_t snor_memmap_read = { #if MX25_BUS_MODE == MX25_BUS_MODE_SPI
.cmd = MX25_CMD_SPI_FAST_READ4B,
.dummy = 8, /* Note, always 8 for this command. */
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_ADDR_MODE_ONE_LINE |
- WSPI_CFG_ALT_MODE_NONE |
- WSPI_CFG_DATA_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8 |
- WSPI_CFG_ADDR_SIZE_32
+ .cfg = MX25_CFG_C8_A32_DATA_SPI
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
.cmd = MX25_CMD_OPI_8READ,
.dummy = MX25_READ_DUMMY_CYCLES,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_ALT_MODE_NONE |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_ADDR_SIZE_32
+ .cfg = MX25_CFG_C16_A32_DATA_8STR
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
.cmd = MX25_CMD_OPI_8DTRD,
.dummy = MX25_READ_DUMMY_CYCLES,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_ALT_MODE_NONE |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_ADDR_SIZE_32 |
- WSPI_CFG_CMD_DTR |
- WSPI_CFG_ADDR_DTR |
- WSPI_CFG_DATA_DTR |
- WSPI_CFG_DQS_ENABLE
+ .cfg = MX25_CFG_C16_A32_DATA_8DTR
#endif
};
-#endif
-#endif
+#endif /* WSPI_SUPPORTS_MEMMAP == TRUE */
+#endif /* SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI */
/*===========================================================================*/
/* Driver local variables and types. */
@@ -112,34 +93,20 @@ static const wspi_command_t mx25_cmd_read_id = { #if MX25_SWITCH_WIDTH == TRUE
.cmd = MX25_CMD_SPI_RDID,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_DATA_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_DATA_SPI,
.dummy = 0,
#else
#if MX25_BUS_MODE == MX25_BUS_MODE_SPI
.cmd = MX25_CMD_SPI_RDID,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_DATA_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_DATA_SPI,
.dummy = 0,
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
.cmd = MX25_CMD_OPI_RDID,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_SIZE_32,
- WSPI_CFG_CMD_SIZE_16,
+ .cfg = MX25_CFG_C16_A32_DATA_8STR,
.dummy = 4U, /*Note: always 4 dummies. */
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
.cmd = MX25_CMD_OPI_RDID,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_ADDR_SIZE_32 |
- WSPI_CFG_CMD_DTR |
- WSPI_CFG_ADDR_DTR,
+ .cfg = MX25_CFG_C16_A32_DATA_8DTR
.dummy = 4U, /*Note: always 4 dummies. */
#endif
#endif
@@ -210,7 +177,7 @@ static void mx25_reset(SNORDriver *devp) { /* 1x MX25_CMD_SPI_RSTEN command.*/
static const wspi_command_t cmd_reset_enable_1 = {
.cmd = MX25_CMD_SPI_RSTEN,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE | WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_SPI,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -219,7 +186,7 @@ static void mx25_reset(SNORDriver *devp) { /* 1x MX25_CMD_SPI_RST command.*/
static const wspi_command_t cmd_reset_memory_1 = {
.cmd = MX25_CMD_SPI_RST,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE | WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_SPI,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -233,9 +200,7 @@ static void mx25_reset(SNORDriver *devp) { /* 8xDTR MX25_CMD_OPI_RSTEN command.*/
static const wspi_command_t cmd_reset_enable_8dtr = {
.cmd = MX25_CMD_OPI_RSTEN,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_CMD_DTR,
+ .cfg = MX25_CFG_C16_8DTR,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -244,9 +209,7 @@ static void mx25_reset(SNORDriver *devp) { /* 8xDTR MX25_CMD_OPI_RST command.*/
static const wspi_command_t cmd_reset_memory_8dtr = {
.cmd = MX25_CMD_OPI_RST,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_CMD_DTR,
+ .cfg = MX25_CFG_C16_8DTR,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -258,8 +221,7 @@ static void mx25_reset(SNORDriver *devp) { /* 8xSTR MX25_CMD_OPI_RSTEN command.*/
static const wspi_command_t cmd_reset_enable_8str = {
.cmd = MX25_CMD_OPI_RSTEN,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16,
+ .cfg = MX25_CFG_C16_8STR,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -268,8 +230,7 @@ static void mx25_reset(SNORDriver *devp) { /* 8xSTR MX25_CMD_OPI_RST command.*/
static const wspi_command_t cmd_reset_memory_8str = {
.cmd = MX25_CMD_OPI_RST,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16,
+ .cfg = MX25_CFG_C16_8STR,
.addr = 0,
.alt = 0,
.dummy = 0
@@ -299,22 +260,17 @@ static void mx25_write_cr2(SNORDriver *devp, uint32_t addr, const uint8_t *value static const wspi_command_t cmd_write_enable = {
#if MX25_SWITCH_WIDTH == TRUE
.cmd = MX25_CMD_SPI_WREN,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_SPI,
#else
#if MX25_BUS_MODE == MX25_BUS_MODE_SPI
.cmd = MX25_CMD_SPI_WREN,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8,
+ .cfg = MX25_CFG_C8_SPI,
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
.cmd = MX25_CMD_OPI_WREN,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16,
+ .cfg = MX25_CFG_C16_8STR,
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
.cmd = MX25_CMD_OPI_WREN,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_CMD_DTR,
+ .cfg = MX25_CFG_C16_8DTR,
#endif
#endif
.addr = 0,
@@ -326,34 +282,17 @@ static void mx25_write_cr2(SNORDriver *devp, uint32_t addr, const uint8_t *value #if MX25_SWITCH_WIDTH == TRUE
.cmd = MX25_CMD_SPI_WRCR2,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_ADDR_MODE_ONE_LINE |
- WSPI_CFG_DATA_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8 |
- WSPI_CFG_ADDR_SIZE_32,
+ .cfg = MX25_CFG_C8_A32_DATA_SPI,
#else
#if MX25_BUS_MODE == MX25_BUS_MODE_SPI
.cmd = MX25_CMD_SPI_WRCR2,
- .cfg = WSPI_CFG_CMD_MODE_ONE_LINE |
- WSPI_CFG_ADDR_MODE_ONE_LINE |
- WSPI_CFG_DATA_MODE_ONE_LINE |
- WSPI_CFG_CMD_SIZE_8 |
- WSPI_CFG_ADDR_SIZE_32,
+ .cfg = MX25_CFG_C8_A32_DATA_SPI,
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
.cmd = MX25_CMD_OPI_WRCR2,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_ADDR_SIZE_32,
+ .cfg = MX25_CFG_C16_A32_DATA_8STR,
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
.cmd = MX25_CMD_OPI_WRCR2,
- .cfg = WSPI_CFG_CMD_MODE_EIGHT_LINES |
- WSPI_CFG_ADDR_MODE_EIGHT_LINES |
- WSPI_CFG_DATA_MODE_EIGHT_LINES |
- WSPI_CFG_CMD_SIZE_16 |
- WSPI_CFG_ADDR_SIZE_32 |
- WSPI_CFG_CMD_DTR,
+ .cfg = MX25_CFG_C16_A32_DATA_8DTR,
#endif
#endif
.addr = addr,
@@ -391,8 +330,9 @@ void snor_device_init(SNORDriver *devp) { mx25_reset(devp);
/* The device requires at least 10uS to recover after a reset, it could
- need up to 100mS in cause a reset occurred during a chip erase.*/
- osalThreadSleepMicroseconds(40);
+ need up to 100mS in cause a reset occurred during a chip erase, 50uS
+ covers most cases.*/
+ osalThreadSleepMicroseconds(50);
}
#endif
@@ -410,15 +350,11 @@ void snor_device_init(SNORDriver *devp) { devp->device_id[1]),
"invalid memory type id");
-
#if SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI
/* Setting up the dummy cycles to be used for fast read operations.*/
{
- static const uint8_t regval[1] = {
- ~((MX25_READ_DUMMY_CYCLES - 6U) / 2U) & 7U
- };
-
- mx25_write_cr2(devp, 0x00000300U, regval);
+ static const uint8_t v[1] = {~((MX25_READ_DUMMY_CYCLES - 6U) / 2U) & 7U};
+ mx25_write_cr2(devp, 0x00000300U, v);
}
#endif
@@ -426,15 +362,15 @@ void snor_device_init(SNORDriver *devp) { {
uint8_t id[8];
#if MX25_BUS_MODE == MX25_BUS_MODE_SPI
- static const uint8_t regval[1] = {0x00};
+ static const uint8_t v[1] = {0x00};
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
- static const uint8_t regval[1] = {0x01};
+ static const uint8_t v[1] = {0x01};
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_DTR
- static const uint8_t regval[1] = {0x02};
+ static const uint8_t v[1] = {0x02};
#endif
/* Setting up final bus width.*/
- mx25_write_cr2(devp, 0x00000000U, regval);
+ mx25_write_cr2(devp, 0x00000000U, v);
/* Reading ID again for confirmation, in DTR mode bytes are read twice,
it needs adjusting.*/
diff --git a/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.h b/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.h index f2a7ceb06..448728d59 100644 --- a/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.h +++ b/os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.h @@ -170,6 +170,95 @@ #define MX25_BUS_MODE_OPI_DTR 2U
/** @} */
+/**
+ * @name MX25-required transfer modes
+ * @{
+ */
+#define MX25_CFG_C8_SPI (WSPI_CFG_CMD_SIZE_8 | \
+ WSPI_CFG_CMD_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE)
+
+#define MX25_CFG_C16_8STR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE)
+
+#define MX25_CFG_C16_8DTR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE | \
+ WSPI_CFG_ALL_DTR)
+
+#define MX25_CFG_C8_A32_SPI (WSPI_CFG_CMD_SIZE_8 | \
+ WSPI_CFG_CMD_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE
+
+#define MX25_CFG_C16_A32_8STR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE)
+
+#define MX25_CFG_C16_A32_8DTR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_NONE | \
+ WSPI_CFG_ALL_DTR)
+
+#define MX25_CFG_C8_DATA_SPI (WSPI_CFG_CMD_SIZE_8 | \
+ WSPI_CFG_CMD_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_ONE_LINE)
+
+#define MX25_CFG_C16_DATA_8STR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_EIGHT_LINES)
+
+#define MX25_CFG_C16_DATA_8DTR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_NONE | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_EIGHT_LINES | \
+ WSPI_CFG_ALL_DTR | \
+ WSPI_CFG_DQS_ENABLE)
+
+#define MX25_CFG_C8_A32_DATA_SPI (WSPI_CFG_CMD_SIZE_8 | \
+ WSPI_CFG_CMD_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_MODE_ONE_LINE | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_ONE_LINE)
+
+#define MX25_CFG_C16_A32_DATA_8STR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_EIGHT_LINES)
+
+#define MX25_CFG_C16_A32_DATA_8DTR (WSPI_CFG_CMD_SIZE_16 | \
+ WSPI_CFG_CMD_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
+ WSPI_CFG_ADDR_SIZE_32 | \
+ WSPI_CFG_ALT_MODE_NONE | \
+ WSPI_CFG_DATA_MODE_EIGHT_LINES | \
+ WSPI_CFG_ALL_DTR | \
+ WSPI_CFG_DQS_ENABLE)
+/** @} */
+
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
@@ -268,104 +357,34 @@ /**
* @brief WSPI settings for command only.
*/
-#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_CMD_DTR)
+#define SNOR_WSPI_CFG_CMD MX25_CFG_C16_8DTR
/**
* @brief WSPI settings for command and address.
*/
-#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_ADDR_SIZE_32 | \
- WSPI_CFG_CMD_DTR | \
- WSPI_CFG_ADDR_DTR)
+#define SNOR_WSPI_CFG_CMD_ADDR MX25_CFG_C16_A32_8DTR
/**
* @brief WSPI settings for command and data.
*/
-#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_EIGHT_LINES | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_CMD_DTR | \
- WSPI_CFG_DATA_DTR | \
- WSPI_CFG_DQS_ENABLE)
+#define SNOR_WSPI_CFG_CMD_DATA MX25_CFG_C16_DATA_8DTR
/**
* @brief WSPI settings for command, address and data.
*/
-#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_EIGHT_LINES | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_ADDR_SIZE_32 | \
- WSPI_CFG_CMD_DTR | \
- WSPI_CFG_ADDR_DTR | \
- WSPI_CFG_DATA_DTR | \
- WSPI_CFG_DQS_ENABLE)
+#define SNOR_WSPI_CFG_CMD_ADDR_DATA MX25_CFG_C16_A32_DATA_8DTR
#elif MX25_BUS_MODE == MX25_BUS_MODE_OPI_STR
-#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_16)
-
-#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_ADDR_SIZE_32)
-
-#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_EIGHT_LINES | \
- WSPI_CFG_CMD_SIZE_16)
-
-#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_EIGHT_LINES | \
- WSPI_CFG_ADDR_MODE_EIGHT_LINES | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_EIGHT_LINES | \
- WSPI_CFG_CMD_SIZE_16 | \
- WSPI_CFG_ADDR_SIZE_32)
+#define SNOR_WSPI_CFG_CMD MX25_CFG_C16_8STR
+#define SNOR_WSPI_CFG_CMD_ADDR MX25_CFG_C16_A32_8STR
+#define SNOR_WSPI_CFG_CMD_DATA MX25_CFG_C16_DATA_8STR
+#define SNOR_WSPI_CFG_CMD_ADDR_DATA MX25_CFG_C16_A32_DATA_8STR
#elif MX25_BUS_MODE == MX25_BUS_MODE_SPI
-#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_ONE_LINE | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_8)
-
-#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_ONE_LINE | \
- WSPI_CFG_ADDR_MODE_ONE_LINE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_NONE | \
- WSPI_CFG_CMD_SIZE_8 | \
- WSPI_CFG_ADDR_SIZE_32)
-
-#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_ONE_LINE | \
- WSPI_CFG_ADDR_MODE_NONE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_ONE_LINE | \
- WSPI_CFG_CMD_SIZE_8)
-
-#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_ONE_LINE | \
- WSPI_CFG_ADDR_MODE_ONE_LINE | \
- WSPI_CFG_ALT_MODE_NONE | \
- WSPI_CFG_DATA_MODE_ONE_LINE | \
- WSPI_CFG_CMD_SIZE_8 | \
- WSPI_CFG_ADDR_SIZE_32)
+#define SNOR_WSPI_CFG_CMD MX25_CFG_C8_SPI
+#define SNOR_WSPI_CFG_CMD_ADDR MX25_CFG_C8_A32_SPI
+#define SNOR_WSPI_CFG_CMD_DATA MX25_CFG_C8_DATA_SPI
+#define SNOR_WSPI_CFG_CMD_ADDR_DATA MX25_CFG_C8_A32_DATA_SPI
#else
#error "invalid MX25_BUS_MODE setting"
diff --git a/os/hal/ports/STM32/LLD/OCTOSPIv1/hal_wspi_lld.c b/os/hal/ports/STM32/LLD/OCTOSPIv1/hal_wspi_lld.c index 1b5088dc8..c7fad45f3 100644 --- a/os/hal/ports/STM32/LLD/OCTOSPIv1/hal_wspi_lld.c +++ b/os/hal/ports/STM32/LLD/OCTOSPIv1/hal_wspi_lld.c @@ -58,6 +58,15 @@ WSPIDriver WSPID2; /*===========================================================================*/
/**
+ * @brief Waits for completion of previous operation.
+ */
+static inline void wspi_lld_sync(WSPIDriver *wspip) {
+
+ while ((wspip->ospi->SR & OCTOSPI_SR_BUSY) != 0U) {
+ }
+}
+
+/**
* @brief Shared service routine.
*
* @param[in] wspip pointer to the @p WSPIDriver object
@@ -244,6 +253,9 @@ void wspi_lld_start(WSPIDriver *wspip) { */
void wspi_lld_stop(WSPIDriver *wspip) {
+ /* Waiting for the previous operation to complete, if any.*/
+ wspi_lld_sync(wspip);
+
/* If in ready state then disables the OCTOSPI clock.*/
if (wspip->state == WSPI_READY) {
@@ -273,6 +285,9 @@ void wspi_lld_stop(WSPIDriver *wspip) { */
void wspi_lld_command(WSPIDriver *wspip, const wspi_command_t *cmdp) {
+ /* Waiting for the previous operation to complete, if any.*/
+ wspi_lld_sync(wspip);
+
#if 0 //STM32_USE_STM32_D1_WORKAROUND == TRUE
/* If it is a command without address and alternate phases then the command
is sent as an alternate byte, the command phase is suppressed.*/
@@ -323,6 +338,9 @@ void wspi_lld_send(WSPIDriver *wspip, const wspi_command_t *cmdp, dmaStreamSetTransactionSize(wspip->dma, n);
dmaStreamSetMode(wspip->dma, wspip->dmamode | STM32_DMA_CR_DIR_M2P);
+ /* Waiting for the previous operation to complete, if any.*/
+ wspi_lld_sync(wspip);
+
wspip->ospi->CR &= ~OCTOSPI_CR_FMODE;
wspip->ospi->DLR = n - 1U;
wspip->ospi->TCR = cmdp->dummy;
@@ -363,6 +381,9 @@ void wspi_lld_receive(WSPIDriver *wspip, const wspi_command_t *cmdp, dmaStreamSetTransactionSize(wspip->dma, n);
dmaStreamSetMode(wspip->dma, wspip->dmamode | STM32_DMA_CR_DIR_P2M);
+ /* Waiting for the previous operation to complete, if any.*/
+ wspi_lld_sync(wspip);
+
wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) | OCTOSPI_CR_FMODE_0;
wspip->ospi->DLR = n - 1U;
wspip->ospi->TCR = cmdp->dummy;
@@ -393,8 +414,8 @@ void wspi_lld_map_flash(WSPIDriver *wspip, const wspi_command_t *cmdp,
uint8_t **addrp) {
- /* Disabling the DMA request while in memory mapped mode.*/
- wspip->ospi->CR &= ~OCTOSPI_CR_DMAEN;
+ /* Waiting for the previous operation to complete, if any.*/
+ wspi_lld_sync(wspip);
/* Starting memory mapped mode using the passed parameters.*/
wspip->ospi->CR = (wspip->ospi->CR & ~OCTOSPI_CR_FMODE) |
diff --git a/readme.txt b/readme.txt index 67ccf8f19..91b110754 100644 --- a/readme.txt +++ b/readme.txt @@ -75,6 +75,10 @@ *****************************************************************************
*** Next ***
+- NEW: Added demo for STM32L4R9I-Discovery board.
+- NEW: Support for new serial NOR device MX25LM51245G. Other Macronix devices
+ should work but not tested.
+- NEW: Serial NOR flash infrastructure reworked and made simpler.
- NEW_ Modified the RTC driver to implement the persistent storage interface
instead of files interface.
- NEW: Added a new "persistent storage" base class to HAL.
diff --git a/testhal/STM32/multi/WSPI-MFS/debug/STM32-WSPI-MFS (Select ELF file)(OpenOCD, Just Run).launch b/testhal/STM32/multi/WSPI-MFS/debug/STM32-WSPI-MFS (Select ELF file)(OpenOCD, Just Run).launch index 71447cb03..71e2e7e7b 100644 --- a/testhal/STM32/multi/WSPI-MFS/debug/STM32-WSPI-MFS (Select ELF file)(OpenOCD, Just Run).launch +++ b/testhal/STM32/multi/WSPI-MFS/debug/STM32-WSPI-MFS (Select ELF file)(OpenOCD, Just Run).launch @@ -35,7 +35,7 @@ <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> <stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?><contentList><content id="CCR-channel-dma-wspip-wspi_lld_serve_interrupt-(format)" val="4"/><content id="SR-ospi-wspip-wspi_lld_serve_interrupt-(format)" val="4"/><content id="cmd-cmdp-wspi_lld_receive-(format)" val="4"/><content id="CCR-ospi-wspip-wspi_lld_receive-(format)" val="4"/><content id="SR-ospi-wspip-wspi_lld_receive-(format)" val="4"/><content id="cfg-cmdp-wspi_lld_receive-(format)" val="4"/><content id="DCR1-ospi-null-port_wait_for_interrupt-(format)" val="4"/><content id="CR-ospi-null-port_wait_for_interrupt-(format)" val="4"/><content id="CCR-channel-dma-wspip-wspi_lld_receive-(format)" val="4"/><content id="cmd-cmd_reset_enable_8str-n25q_reset_memory-(format)" val="4"/><content id="DCR1-ospi-wspip-wspi_lld_command-(format)" val="4"/><content id="CR-ospi-wspip-wspi_lld_command-(format)" val="4"/><content id="cfg-cmdp-wspi_lld_command-(format)" val="4"/><content id="cmd-cmdp-wspiCommand-(format)" val="4"/><content id="cmd-cmdp-wspi_lld_command-(format)" val="4"/><content id="xPSR-(format)" val="4"/><content id="CCR-channel-dma-null-_idle_thread-(format)" val="4"/><content id="CR-ospi-null-_idle_thread-(format)" val="4"/><content id="device_id-devp-snor_device_init-(format)" val="4"/><content id="device_id[0]-device_id-devp-snor_device_init-(format)" val="4"/><content id="device_id[1]-device_id-devp-snor_device_init-(format)" val="4"/><content id="device_id[2]-device_id-devp-snor_device_init-(format)" val="4"/></contentList>"/> <stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <globalVariableList/> "/> -<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList> <memoryBlockExpressionItem> <expression text="0x40021004"/> </memoryBlockExpressionItem> </memoryBlockExpressionList> "/> +<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList> <memoryBlockExpressionItem> <expression text="0x70000000"/> </memoryBlockExpressionItem> </memoryBlockExpressionList> "/> <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="${selected_resource_loc}"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="STM32-WSPI-MFS"/> <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/> |