diff options
Diffstat (limited to 'src/imxrt10xx.rs')
| -rw-r--r-- | src/imxrt10xx.rs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/imxrt10xx.rs b/src/imxrt10xx.rs new file mode 100644 index 0000000..fe414fe --- /dev/null +++ b/src/imxrt10xx.rs @@ -0,0 +1,100 @@ +use core::marker::PhantomData; + +use imxrt_drivers_ccm_10xx::{ccm, ccm_analog}; +use imxrt_drivers_dcdc as dcdc; +use imxrt_drivers_flexspi as flexspi; + +const FLEXSPI1_BASE: u32 = 0x6000_0000; + +pub trait Imxrt10xx: 'static { + const FLEXSPI1_INSTANCE: flexspi::Instance; + const CCM_INSTANCE: ccm::Instance; + const CCM_ANALOG_INSTANCE: ccm_analog::Instance; + const DCDC_INSTANCE: dcdc::Instance; + + const FLEXSPI_FIFO_CAPACITY_BYTES: usize; + + fn configure_clocks(ccm: ccm::Instance, ccm_analog: ccm_analog::Instance, dcdc: dcdc::Instance); +} + +pub struct Algorithm<C: Imxrt10xx, F: crate::ImxrtFlashAlgorithm>(PhantomData<(C, F)>); + +impl<C: Imxrt10xx, F: crate::ImxrtFlashAlgorithm> Algorithm<C, F> { + pub const fn flash_size_bytes() -> usize { + F::FLASH_CAPACITY_BYTES + } + pub const fn flash_address() -> usize { + FLEXSPI1_BASE as _ + } + pub const fn sector_size_bytes() -> usize { + F::FLASH_SECTOR_SIZE_BYTES + } + pub const fn page_size_bytes() -> usize { + F::FLASH_PAGE_SIZE_BYTES + } + + pub fn initialize() -> Self { + C::configure_clocks(C::CCM_INSTANCE, C::CCM_ANALOG_INSTANCE, C::DCDC_INSTANCE); + crate::reset(C::FLEXSPI1_INSTANCE, F::FLASH_CAPACITY_BYTES / 1024, 128); + F::initialize(C::FLEXSPI1_INSTANCE); + Algorithm(PhantomData) + } + + pub fn flash_read(&mut self, address: usize, data: &mut [u8]) { + crate::flash::read(C::FLEXSPI1_INSTANCE, address, data); + } + + pub fn flash_erase_sector(&mut self, address: usize) { + crate::flash::erase_sector(C::FLEXSPI1_INSTANCE, address); + } + + pub fn flash_write(&mut self, address: usize, data: &[u8]) { + crate::flash::write(C::FLEXSPI1_INSTANCE, address, data); + } +} + +impl<C: Imxrt10xx, F: crate::ImxrtFlashAlgorithm> flash_algorithm::FlashAlgorithm + for Algorithm<C, F> +{ + fn new( + _: u32, + _: u32, + _: flash_algorithm::Function, + ) -> Result<Self, flash_algorithm::ErrorCode> { + Ok(Self::initialize()) + } + + fn erase_all(&mut self) -> Result<(), flash_algorithm::ErrorCode> { + crate::flash::erase_chip(C::FLEXSPI1_INSTANCE); + Ok(()) + } + + fn erase_sector(&mut self, address: u32) -> Result<(), flash_algorithm::ErrorCode> { + self.flash_erase_sector(address.saturating_sub(FLEXSPI1_BASE) as usize); + Ok(()) + } + + fn program_page( + &mut self, + address: u32, + data: &[u8], + ) -> Result<(), flash_algorithm::ErrorCode> { + self.flash_write(address.saturating_sub(FLEXSPI1_BASE) as usize, data); + Ok(()) + } + + fn read_flash( + &mut self, + address: u32, + data: &mut [u8], + ) -> Result<(), flash_algorithm::ErrorCode> { + self.flash_read(address.saturating_sub(FLEXSPI1_BASE) as usize, data); + Ok(()) + } +} + +impl<C: Imxrt10xx, F: crate::ImxrtFlashAlgorithm> Drop for Algorithm<C, F> { + fn drop(&mut self) { + F::deinitialize(C::FLEXSPI1_INSTANCE); + } +} |
