This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 430c79ff89 imxrt: FlexSPI allow RWW
430c79ff89 is described below
commit 430c79ff8961a6608136877b398f02b0aa150869
Author: Peter van der Perk <[email protected]>
AuthorDate: Tue Dec 24 13:46:44 2024 +0100
imxrt: FlexSPI allow RWW
---
arch/arm/src/imxrt/Kconfig | 16 ++++++++++
arch/arm/src/imxrt/imxrt_flexspi.c | 57 +++++++++++++++++++++++++++++++++++
arch/arm/src/imxrt/imxrt_flexspi.h | 18 +++++++++++
arch/arm/src/imxrt/imxrt_periphclks.h | 1 +
4 files changed, 92 insertions(+)
diff --git a/arch/arm/src/imxrt/Kconfig b/arch/arm/src/imxrt/Kconfig
index 872493bd4d..7e202d208e 100644
--- a/arch/arm/src/imxrt/Kconfig
+++ b/arch/arm/src/imxrt/Kconfig
@@ -1871,12 +1871,28 @@ menuconfig IMXRT_FLEXSPI1
default n
select IMXRT_FLEXSPI
+menuconfig IMXRT_FLEXSPI1_XIP
+ bool "FLEXSPI1 is used for XIP"
+ default n
+ depends on IMXRT_FLEXSPI1
+ ---help---
+ FlexSPI1 is used as XIP thus already
+ initialized by the bootloader
+
menuconfig IMXRT_FLEXSPI2
bool "FLEXSPI2"
default n
select IMXRT_FLEXSPI
depends on IMXRT_HAVE_FLEXSPI2
+menuconfig IMXRT_FLEXSPI2_XIP
+ bool "FLEXSPI2 is used for XIP"
+ default n
+ depends on IMXRT_FLEXSPI2
+ ---help---
+ FlexSPI2 is used as XIP thus already
+ initialized by the bootloader
+
endmenu # FLEXSPI Peripherals
menu "ADC Peripherals"
diff --git a/arch/arm/src/imxrt/imxrt_flexspi.c
b/arch/arm/src/imxrt/imxrt_flexspi.c
index 995d74d346..31d3d2076b 100644
--- a/arch/arm/src/imxrt/imxrt_flexspi.c
+++ b/arch/arm/src/imxrt/imxrt_flexspi.c
@@ -83,6 +83,8 @@ static int imxrt_flexspi_lock(struct flexspi_dev_s *dev, bool
lock);
static int imxrt_flexspi_transfer_blocking(struct flexspi_dev_s *dev,
struct flexspi_transfer_s *xfer);
static void imxrt_flexspi_software_reset(struct flexspi_dev_s *dev);
+static void imxrt_flexspi_configure_prefetch(struct flexspi_dev_s *dev,
+ bool enable);
static void imxrt_flexspi_update_lut(struct flexspi_dev_s *dev,
uint32_t index,
const uint32_t *cmd,
@@ -102,6 +104,7 @@ static const struct flexspi_ops_s g_flexspi0ops =
.lock = imxrt_flexspi_lock,
.transfer_blocking = imxrt_flexspi_transfer_blocking,
.software_reset = imxrt_flexspi_software_reset,
+ .configure_prefetch = imxrt_flexspi_configure_prefetch,
.update_lut = imxrt_flexspi_update_lut,
.set_device_config = imxrt_flexspi_set_device_config,
};
@@ -118,6 +121,9 @@ static struct imxrt_flexspidev_s g_flexspi0dev =
},
.base = (struct flexspi_type_s *)IMXRT_FLEXSPIC_BASE,
.lock = NXMUTEX_INITIALIZER,
+#ifdef CONFIG_IMXRT_FLEXSPI1_XIP
+ .initialized = true,
+#endif
};
#endif
@@ -131,6 +137,9 @@ static struct imxrt_flexspidev_s g_flexspi1dev =
.ops = &g_flexspi0ops,
},
.base = (struct flexspi_type_s *) IMXRT_FLEXSPI2C_BASE,
+#ifdef CONFIG_IMXRT_FLEXSPI2_XIP
+ .initialized = true,
+#endif
};
#endif
@@ -330,6 +339,31 @@ static inline void imxrt_flexspi_software_reset_private(
}
}
+/* Configure FLEXSPI preftech.
+ *
+ * This function enables/disabled the prefetcher
+ * Which is needed to do RWW see NXP AN12564
+ *
+ * @param base FLEXSPI peripheral base address.
+ */
+
+static inline void imxrt_flexspi_configure_prefetch_private(
+ struct flexspi_type_s *base, bool enable)
+{
+ uint32_t config_value = base->AHBCR;
+
+ if (enable)
+ {
+ config_value |= FLEXSPI_AHBCR_PREFETCHEN(1);
+ }
+ else
+ {
+ config_value &= ~FLEXSPI_AHBCR_PREFETCHEN(1);
+ }
+
+ base->AHBCR = config_value;
+}
+
/* Returns whether the bus is idle.
*
* @param base FLEXSPI peripheral base address.
@@ -1173,6 +1207,29 @@ static void imxrt_flexspi_software_reset(struct
flexspi_dev_s *dev)
imxrt_flexspi_software_reset_private(priv->base);
}
+/****************************************************************************
+ * Name: imxrt_flexspi_configure_prefetch
+ *
+ * Description:
+ * Configures prefetch
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ * enable - Enable prefetch
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+static void imxrt_flexspi_configure_prefetch(struct flexspi_dev_s *dev,
+ bool enable)
+{
+ struct imxrt_flexspidev_s *priv = (struct imxrt_flexspidev_s *)dev;
+
+ imxrt_flexspi_configure_prefetch_private(priv->base, enable);
+}
+
/****************************************************************************
* Name: imxrt_flexspi_update_lut
*
diff --git a/arch/arm/src/imxrt/imxrt_flexspi.h
b/arch/arm/src/imxrt/imxrt_flexspi.h
index c5eee1b7c0..d73a576cf0 100644
--- a/arch/arm/src/imxrt/imxrt_flexspi.h
+++ b/arch/arm/src/imxrt/imxrt_flexspi.h
@@ -127,6 +127,23 @@
#define FLEXSPI_TRANSFER(d,x) (d)->ops->transfer_blocking(d,x)
+/****************************************************************************
+ * Name: FLEXSPI_CONFIGURE_PREFTECH
+ *
+ * Description:
+ * Enable / disable prefetch
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ * enable - Enable prefetch
+ *
+ * Returned Value:
+ * none
+ *
+ ****************************************************************************/
+
+#define FLEXSPI_CONFIGURE_PREFETCH(d,e) (d)->ops->configure_prefetch(d,e)
+
/****************************************************************************
* Name: FLEXSPI_SOFTWARE_RESET
*
@@ -508,6 +525,7 @@ struct flexspi_ops_s
int (*transfer_blocking)(struct flexspi_dev_s *dev,
struct flexspi_transfer_s *xfer);
void (*software_reset)(struct flexspi_dev_s *dev);
+ void (*configure_prefetch)(struct flexspi_dev_s *dev, bool enable);
void (*update_lut)(struct flexspi_dev_s *dev,
uint32_t index, const uint32_t *cmd,
uint32_t count);
diff --git a/arch/arm/src/imxrt/imxrt_periphclks.h
b/arch/arm/src/imxrt/imxrt_periphclks.h
index 948c46a9aa..55f3c9d61e 100644
--- a/arch/arm/src/imxrt/imxrt_periphclks.h
+++ b/arch/arm/src/imxrt/imxrt_periphclks.h
@@ -259,6 +259,7 @@
#define imxrt_clockrun_flexram()
imxrt_periphclk_configure(CCM_CCGR_FLEXRAM, CCM_CG_RUN)
#ifndef CONFIG_ARCH_FAMILY_IMXRT117x
# define imxrt_clockrun_flexspi()
imxrt_periphclk_configure(CCM_CCGR_FLEXSPI, CCM_CG_RUN)
+# define imxrt_clockrun_flexspi2()
imxrt_periphclk_configure(CCM_CCGR_FLEXSPI2, CCM_CG_RUN)
#else
# define imxrt_clockrun_flexspi()
imxrt_periphclk_configure(CCM_CCGR_FLEXSPI1, CCM_CG_RUN)
# define imxrt_clockrun_flexspi2()
imxrt_periphclk_configure(CCM_CCGR_FLEXSPI2, CCM_CG_RUN)