diff --git a/arch/arm/src/nrf52/nrf52_qspi.c b/arch/arm/src/nrf52/nrf52_qspi.c index c95df57e26f..3a4af11374f 100644 --- a/arch/arm/src/nrf52/nrf52_qspi.c +++ b/arch/arm/src/nrf52/nrf52_qspi.c @@ -123,6 +123,9 @@ static const struct qspi_ops_s g_qspi_ops = .setfrequency = nrf52_qspi_setfrequency, .setmode = nrf52_qspi_setmode, .setbits = nrf52_qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = nrf52_qspi_command, .memory = nrf52_qspi_memory, .alloc = nrf52_qspi_alloc, diff --git a/arch/arm/src/nrf53/nrf53_qspi.c b/arch/arm/src/nrf53/nrf53_qspi.c index 7f06a965960..bece954af88 100644 --- a/arch/arm/src/nrf53/nrf53_qspi.c +++ b/arch/arm/src/nrf53/nrf53_qspi.c @@ -133,6 +133,9 @@ static const struct qspi_ops_s g_qspi_ops = .setfrequency = nrf53_qspi_setfrequency, .setmode = nrf53_qspi_setmode, .setbits = nrf53_qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = nrf53_qspi_command, .memory = nrf53_qspi_memory, .alloc = nrf53_qspi_alloc, diff --git a/arch/arm/src/s32k3xx/s32k3xx_qspi.c b/arch/arm/src/s32k3xx/s32k3xx_qspi.c index 5a6ebcb9b7c..e17166171a2 100644 --- a/arch/arm/src/s32k3xx/s32k3xx_qspi.c +++ b/arch/arm/src/s32k3xx/s32k3xx_qspi.c @@ -210,6 +210,9 @@ static const struct qspi_ops_s g_qspi0ops = .setfrequency = qspi_setfrequency, .setmode = qspi_setmode, .setbits = qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = qspi_command, .memory = qspi_memory, .alloc = qspi_alloc, diff --git a/arch/arm/src/samv7/sam_qspi.c b/arch/arm/src/samv7/sam_qspi.c index 1c943340bd4..5b666d22873 100644 --- a/arch/arm/src/samv7/sam_qspi.c +++ b/arch/arm/src/samv7/sam_qspi.c @@ -292,6 +292,9 @@ static const struct qspi_ops_s g_qspi0ops = .setfrequency = qspi_setfrequency, .setmode = qspi_setmode, .setbits = qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = qspi_command, .memory = qspi_memory, .alloc = qspi_alloc, diff --git a/arch/arm/src/stm32f7/stm32_qspi.c b/arch/arm/src/stm32f7/stm32_qspi.c index 08bb0643ac5..9dfdaaf68ef 100644 --- a/arch/arm/src/stm32f7/stm32_qspi.c +++ b/arch/arm/src/stm32f7/stm32_qspi.c @@ -325,6 +325,9 @@ static const struct qspi_ops_s g_qspi0ops = .setfrequency = qspi_setfrequency, .setmode = qspi_setmode, .setbits = qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = qspi_command, .memory = qspi_memory, .alloc = qspi_alloc, diff --git a/arch/arm/src/stm32h7/stm32_qspi.c b/arch/arm/src/stm32h7/stm32_qspi.c index 52f5261e6f2..288766536dc 100644 --- a/arch/arm/src/stm32h7/stm32_qspi.c +++ b/arch/arm/src/stm32h7/stm32_qspi.c @@ -350,6 +350,9 @@ static const struct qspi_ops_s g_qspi0ops = .setfrequency = qspi_setfrequency, .setmode = qspi_setmode, .setbits = qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = qspi_command, .memory = qspi_memory, .alloc = qspi_alloc, diff --git a/arch/arm/src/stm32l4/stm32l4_qspi.c b/arch/arm/src/stm32l4/stm32l4_qspi.c index 39b66550734..a6e228ccbcc 100644 --- a/arch/arm/src/stm32l4/stm32l4_qspi.c +++ b/arch/arm/src/stm32l4/stm32l4_qspi.c @@ -323,6 +323,9 @@ static const struct qspi_ops_s g_qspi0ops = .setfrequency = qspi_setfrequency, .setmode = qspi_setmode, .setbits = qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = qspi_command, .memory = qspi_memory, .alloc = qspi_alloc, diff --git a/arch/xtensa/src/esp32s3/esp32s3_qspi.c b/arch/xtensa/src/esp32s3/esp32s3_qspi.c index 9ac7f1b6553..14385222573 100644 --- a/arch/xtensa/src/esp32s3/esp32s3_qspi.c +++ b/arch/xtensa/src/esp32s3/esp32s3_qspi.c @@ -289,6 +289,9 @@ static const struct qspi_ops_s esp32s3_spi2_ops = .setfrequency = esp32s3_qspi_setfrequency, .setmode = esp32s3_qspi_setmode, .setbits = esp32s3_qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = esp32s3_qspi_command, .memory = esp32s3_qspi_memory, .alloc = esp32s3_qspi_alloc, @@ -379,6 +382,9 @@ static const struct qspi_ops_s esp32s3_spi3_ops = .setfrequency = esp32s3_qspi_setfrequency, .setmode = esp32s3_qspi_setmode, .setbits = esp32s3_qspi_setbits, +#ifdef CONFIG_QSPI_HWFEATURES + .hwfeatures = NULL, +#endif .command = esp32s3_qspi_command, .memory = esp32s3_qspi_memory, .alloc = esp32s3_qspi_alloc, diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index b305bca9229..3395b63b602 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -15,6 +15,14 @@ config ARCH_HAVE_SPI_BITORDER bool default n +config ARCH_HAVE_QSPI_BITORDER + bool + default n + +config ARCH_HAVE_QSPI_WORD_REVERSE + bool + default n + menuconfig SPI bool "SPI Driver Support" default n @@ -163,6 +171,32 @@ config SPI_BITORDER Enables capability to select MSB- or LSB-first hardware feature for data transfers. +config QSPI_HWFEATURES + bool + default n + ---help--- + Selected only if a specific H/W feature is selected. This is + basically the OR of any specific hardware feature and enables + the QSPI hwfeatures() interface method. + +config QSPI_BITORDER + bool "QSPI Bit Order Control" + default n + select QSPI_HWFEATURES + depends on ARCH_HAVE_QSPI_BITORDER + ---help--- + Enables capability to select MSB- or LSB-first hardware feature for + data transfers. + +config QSPI_WORD_REVERSE + bool "QSPI word reverse Control" + default n + select QSPI_HWFEATURES + depends on ARCH_HAVE_QSPI_WORD_REVERSE + ---help--- + Enables capability to word reverse hardware feature for + data transfers. + config SPI_DELAY_CONTROL bool "SPI Delay Control" default n diff --git a/drivers/spi/qspi_flash.c b/drivers/spi/qspi_flash.c index a5ca33ab47a..2c8aa23e20b 100644 --- a/drivers/spi/qspi_flash.c +++ b/drivers/spi/qspi_flash.c @@ -200,6 +200,9 @@ static const struct qspi_ops_s g_qspiops = qspi_flash_setfrequency, /* setfrequency */ qspi_flash_setmode, /* setmode */ qspi_flash_setbits, /* setbits */ +#ifdef CONFIG_QSPI_HWFEATURES + NULL, /* hwfeatures */ +#endif qspi_flash_command, /* command */ qspi_flash_memory, /* memory */ qspi_flash_alloc, /* alloc */ diff --git a/include/nuttx/spi/qspi.h b/include/nuttx/spi/qspi.h index fd2de28e8bd..469e3a1b3ae 100644 --- a/include/nuttx/spi/qspi.h +++ b/include/nuttx/spi/qspi.h @@ -113,6 +113,48 @@ #define QSPI_SETBITS(d,b) (d)->ops->setbits(d,b) +/**************************************************************************** + * Name: QSPI_HWFEATURES + * + * Description: + * Set hardware-specific feature flags. + * + * Input Parameters: + * dev - Device-specific state data + * features - H/W feature flags + * + * Returned Value: + * Zero (OK) if the selected H/W features are enabled; A negated errno + * value if any H/W feature is not supportable. + * + ****************************************************************************/ + +#ifdef CONFIG_QSPI_HWFEATURES + /* If there are multiple QSPI drivers, some may not support hardware + * feature selection. + */ + +# define QSPI_HWFEATURES(d,f) \ + (((d)->ops->hwfeatures) ? (d)->ops->hwfeatures(d,f) : ((f) == 0 ? OK : -ENOSYS)) + +# ifdef CONFIG_QSPI_BITORDER +# define QSPI_HWFEAT_MSBFIRST (0 << 0) +# define QSPI_HWFEAT_LSBFIRST (1 << 0) +# endif + +# ifdef CONFIG_QSPI_WORD_REVERSE +# define QSPI_HWFEAT_WORD_REVERSE_DISABLE (0 << 1) +# define QSPI_HWFEAT_WORD_REVERSE_ENABLE (1 << 1) +# endif + +#else + /* Any attempt to select hardware features with CONFIG_QSPI_HWFEATURES + * deselected will return an -ENOSYS error. + */ + +# define QSPI_HWFEATURES(d,f) (((f) == 0) ? OK : -ENOSYS) +#endif + /**************************************************************************** * Name: QSPI_COMMAND * @@ -260,6 +302,12 @@ struct qspi_meminfo_s FAR void *buffer; /* Data buffer */ }; +#ifdef CONFIG_QSPI_HWFEATURES +/* This is a type wide enough to support all hardware features */ + +typedef uint8_t qspi_hwfeatures_t; +#endif + /* The QSPI vtable */ struct qspi_dev_s; @@ -271,6 +319,10 @@ struct qspi_ops_s CODE void (*setmode)(FAR struct qspi_dev_s *dev, enum qspi_mode_e mode); CODE void (*setbits)(FAR struct qspi_dev_s *dev, int nbits); +#ifdef CONFIG_QSPI_HWFEATURES + CODE int (*hwfeatures)(FAR struct qspi_dev_s *dev, + qspi_hwfeatures_t features); +#endif CODE int (*command)(FAR struct qspi_dev_s *dev, FAR struct qspi_cmdinfo_s *cmdinfo); CODE int (*memory)(FAR struct qspi_dev_s *dev,