aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--os/hal/include/hal_wspi.h5
-rw-r--r--os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.c128
-rw-r--r--os/hal/lib/complex/serial_nor/devices/macronix_mx25/hal_flash_device.h183
-rw-r--r--os/hal/ports/STM32/LLD/OCTOSPIv1/hal_wspi_lld.c25
-rw-r--r--readme.txt4
-rw-r--r--testhal/STM32/multi/WSPI-MFS/debug/STM32-WSPI-MFS (Select ELF file)(OpenOCD, Just Run).launch2
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="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;CCR-channel-dma-wspip-wspi_lld_serve_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;SR-ospi-wspip-wspi_lld_serve_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cmd-cmdp-wspi_lld_receive-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CCR-ospi-wspip-wspi_lld_receive-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;SR-ospi-wspip-wspi_lld_receive-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cfg-cmdp-wspi_lld_receive-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;DCR1-ospi-null-port_wait_for_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR-ospi-null-port_wait_for_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CCR-channel-dma-wspip-wspi_lld_receive-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cmd-cmd_reset_enable_8str-n25q_reset_memory-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;DCR1-ospi-wspip-wspi_lld_command-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR-ospi-wspip-wspi_lld_command-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cfg-cmdp-wspi_lld_command-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cmd-cmdp-wspiCommand-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cmd-cmdp-wspi_lld_command-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;xPSR-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CCR-channel-dma-null-_idle_thread-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR-ospi-null-_idle_thread-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;device_id-devp-snor_device_init-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;device_id[0]-device_id-devp-snor_device_init-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;device_id[1]-device_id-devp-snor_device_init-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;device_id[2]-device_id-devp-snor_device_init-(format)&quot; val=&quot;4&quot;/&gt;&lt;/contentList&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;globalVariableList/&gt;&#10;"/>
-<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList&gt;&#10;&lt;memoryBlockExpressionItem&gt;&#10;&lt;expression text=&quot;0x40021004&quot;/&gt;&#10;&lt;/memoryBlockExpressionItem&gt;&#10;&lt;/memoryBlockExpressionList&gt;&#10;"/>
+<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList&gt;&#10;&lt;memoryBlockExpressionItem&gt;&#10;&lt;expression text=&quot;0x70000000&quot;/&gt;&#10;&lt;/memoryBlockExpressionItem&gt;&#10;&lt;/memoryBlockExpressionList&gt;&#10;"/>
<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"/>