From fa5b0daeb02bb1775462ac57b353589d983fa2bb Mon Sep 17 00:00:00 2001 From: Ian McIntyre Date: Wed, 17 Dec 2025 19:33:41 -0500 Subject: Configure FlexSPI1 pins on 11xx MCUs --- Cargo.lock | 37 +++++++++++++++++++------------------ Cargo.toml | 2 ++ README.md | 5 +++++ imxrt1160/src/lib.rs | 1 + imxrt1170/src/lib.rs | 1 + imxrt1170evk/examples/smoke.rs | 4 +++- src/imxrt11xx.rs | 33 +++++++++++++++++++++++++++++++++ 7 files changed, 64 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fad3e71..40c6096 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -129,7 +129,7 @@ checksum = "cf0040922d40f085f9b4902ed60479bcc93389a59c253f3f715cc42cfc1ff1ee" [[package]] name = "imxrt-drivers-ccm-10xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-ccm-11xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -145,7 +145,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-dcdc" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -153,7 +153,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-edma" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-enet" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-flexspi" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -177,7 +177,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-gpc-11xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -185,7 +185,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-gpio" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-iomuxc-10xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-iomuxc-11xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -209,7 +209,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-lpspi" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-pit" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -225,7 +225,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-pmu-11xx" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -233,7 +233,7 @@ dependencies = [ [[package]] name = "imxrt-drivers-rtwdog" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "ral-registers", ] @@ -249,6 +249,7 @@ dependencies = [ "imxrt-drivers-dcdc", "imxrt-drivers-flexspi", "imxrt-drivers-gpc-11xx", + "imxrt-drivers-iomuxc-11xx", "imxrt-drivers-pmu-11xx", "imxrt-drivers-rtwdog", "ral-registers", @@ -266,7 +267,7 @@ dependencies = [ [[package]] name = "imxrt1010" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "cortex-m", "imxrt-drivers-ccm-10xx", @@ -305,7 +306,7 @@ dependencies = [ [[package]] name = "imxrt1040" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "cortex-m", "imxrt-drivers-ccm-10xx", @@ -346,7 +347,7 @@ dependencies = [ [[package]] name = "imxrt1160" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "cortex-m", "imxrt-drivers-ccm-11xx", @@ -385,7 +386,7 @@ dependencies = [ [[package]] name = "imxrt1170" version = "0.1.0" -source = "git+https://git.mciantyre.dev/imxrt-drivers#76199f21616ad86cf68f3b063c1ce23c6fc5a52f" +source = "git+https://git.mciantyre.dev/imxrt-drivers#90693d06c183f77a5aa2de3f7ab0bed4bd213c45" dependencies = [ "cortex-m", "imxrt-drivers-ccm-11xx", diff --git a/Cargo.toml b/Cargo.toml index a961bff..468fd20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ ral-registers = { workspace = true } imxrt-drivers-rtwdog = { workspace = true } imxrt-drivers-ccm-10xx = { workspace = true } imxrt-drivers-ccm-11xx = { workspace = true } +imxrt-drivers-iomuxc-11xx = { workspace = true } imxrt-drivers-dcdc = { workspace = true } imxrt-drivers-pmu-11xx = { workspace = true } imxrt-drivers-gpc-11xx = { workspace = true } @@ -25,6 +26,7 @@ imxrt-drivers-flexspi = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-rtwdog = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-ccm-10xx = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-ccm-11xx = { git = "https://git.mciantyre.dev/imxrt-drivers" } +imxrt-drivers-iomuxc-11xx = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-dcdc = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-gpc-11xx = { git = "https://git.mciantyre.dev/imxrt-drivers" } imxrt-drivers-pmu-11xx = { git = "https://git.mciantyre.dev/imxrt-drivers" } diff --git a/README.md b/README.md index e52f598..8085985 100644 --- a/README.md +++ b/README.md @@ -60,4 +60,9 @@ Eventually, I might try to define a universal flash programming algorithm, one that works across different flash parts. But for now, they're separate by manufacturer. +FlexSPI pin muxing assumes you're using the boot ROM's primary FlexSPI1 +interface. In fact, all algorithms assume you're using FlexSPI1! If your board +is doing something different, then you'll need to manually change the pin muxing +/ FlexSPI instance. There's no board-by-board configuration. + License: APACHE-2.0 diff --git a/imxrt1160/src/lib.rs b/imxrt1160/src/lib.rs index 33b0de9..d494c8a 100644 --- a/imxrt1160/src/lib.rs +++ b/imxrt1160/src/lib.rs @@ -13,6 +13,7 @@ impl imxrt11xx::Imxrt11xx for Imxrt1160 { unsafe { imxrt1160::instances::gpc_cpu_mode_ctrl0() }; const PMU_INSTANCE: imxrt1160::pmu::Instance = unsafe { imxrt1160::instances::pmu() }; const RTWDOG_INSTANCE: imxrt1160::rtwdog::Instance = unsafe { imxrt1160::instances::wdog3() }; + const IOMUXC_INSTANCE: imxrt1160::iomuxc::Instance = unsafe { imxrt1160::instances::iomuxc() }; const FLEXSPI_FIFO_CAPACITY_BYTES: usize = 128; } diff --git a/imxrt1170/src/lib.rs b/imxrt1170/src/lib.rs index 89469b1..7a78556 100644 --- a/imxrt1170/src/lib.rs +++ b/imxrt1170/src/lib.rs @@ -13,6 +13,7 @@ impl imxrt11xx::Imxrt11xx for Imxrt1170 { unsafe { imxrt1170::instances::gpc_cpu_mode_ctrl0() }; const PMU_INSTANCE: imxrt1170::pmu::Instance = unsafe { imxrt1170::instances::pmu() }; const RTWDOG_INSTANCE: imxrt1170::rtwdog::Instance = unsafe { imxrt1170::instances::wdog3() }; + const IOMUXC_INSTANCE: imxrt1170::iomuxc::Instance = unsafe { imxrt1170::instances::iomuxc() }; const FLEXSPI_FIFO_CAPACITY_BYTES: usize = 256; } diff --git a/imxrt1170evk/examples/smoke.rs b/imxrt1170evk/examples/smoke.rs index df91789..63428ac 100644 --- a/imxrt1170evk/examples/smoke.rs +++ b/imxrt1170evk/examples/smoke.rs @@ -14,7 +14,9 @@ fn main() -> ! { let mut sector = [0_u8; Algorithm::sector_size_bytes()]; is25wp.flash_read(0x400, &mut sector[..4]); - defmt::assert!(0x42464346 == u32::from_le_bytes(sector[..4].try_into().unwrap())); + if 0x42464346 != u32::from_le_bytes(sector[..4].try_into().unwrap()) { + defmt::warn!("No FCB found."); + } is25wp.flash_erase_sector(LAST_SECTOR + 256); diff --git a/src/imxrt11xx.rs b/src/imxrt11xx.rs index ed83668..0fc3ae1 100644 --- a/src/imxrt11xx.rs +++ b/src/imxrt11xx.rs @@ -3,11 +3,42 @@ use core::{marker::PhantomData, num::NonZero}; use imxrt_drivers_ccm_11xx::ral_11xx as ccm; use imxrt_drivers_flexspi as flexspi; use imxrt_drivers_gpc_11xx::cpu_mode_ctrl as gpc_cpu; +use imxrt_drivers_iomuxc_11xx::iomuxc; use imxrt_drivers_pmu_11xx as pmu; use imxrt_drivers_rtwdog as rtwdog; +use ral_registers as ral; + const FLEXSPI1_BASE: u32 = 0x3000_0000; +/// Assumes the boot ROM's primary FlexSPI1 interface. +fn configure_pins(iomuxc: iomuxc::Instance) { + use iomuxc::select_input::*; + + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[5], MUX_MODE: 1, SION: 1); // DQS + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[6], MUX_MODE: 1, SION: 0); + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[7], MUX_MODE: 1, SION: 1); // SCK + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[8], MUX_MODE: 1, SION: 0); + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[9], MUX_MODE: 1, SION: 0); + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[10], 1); + ral::write_reg!(iomuxc, iomuxc, SW_MUX_CTL_PAD.GPIO_SD_B2[11], 1); + + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[5], PDRV: NORMAL, PULL: PULL_DOWN); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[6], PDRV: NORMAL, PULL: NO_PULL); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[7], PDRV: NORMAL, PULL: NO_PULL); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[8], PDRV: NORMAL, PULL: NO_PULL); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[9], PDRV: NORMAL, PULL: NO_PULL); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[10], PDRV: NORMAL, PULL: NO_PULL); + ral::write_reg!(iomuxc, iomuxc, SW_PAD_CTL_PAD.GPIO_SD_B2[11], PDRV: NORMAL, PULL: NO_PULL); + + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_DQS_FA], 2); + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_IO_FA_0], 1); + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_IO_FA_1], 1); + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_IO_FA_2], 1); + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_IO_FA_3], 1); + ral::write_reg!(iomuxc, iomuxc, SELECT_INPUT[FLEXSPI1_I_SCK_FA], 1); +} + /// Establish the core, bus, and FlexSPI /// clock frequencies. fn configure_clocks( @@ -121,6 +152,7 @@ pub trait Imxrt11xx: 'static { const CCM_PLL_INSTANCE: ccm::pll::Instance; const GPC_CPU_INSTANCE: gpc_cpu::Instance; const RTWDOG_INSTANCE: rtwdog::Instance; + const IOMUXC_INSTANCE: iomuxc::Instance; const FLEXSPI_FIFO_CAPACITY_BYTES: usize; } @@ -143,6 +175,7 @@ impl Algorithm { pub fn initialize() -> Self { rtwdog::disable(C::RTWDOG_INSTANCE); + configure_pins(C::IOMUXC_INSTANCE); configure_clocks( C::CCM_INSTANCE, C::CCM_PLL_INSTANCE, -- cgit v1.2.3