nrf/qspi: remove FLASH_SIZE const generic param.

This commit is contained in:
Dario Nieuwenhuis 2023-03-05 02:33:02 +01:00
parent 75f69803af
commit 8eb8ea6174
3 changed files with 22 additions and 18 deletions

View file

@ -8,6 +8,7 @@ use core::task::Poll;
use embassy_hal_common::drop::OnDrop; use embassy_hal_common::drop::OnDrop;
use embassy_hal_common::{into_ref, PeripheralRef}; use embassy_hal_common::{into_ref, PeripheralRef};
use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash};
use crate::gpio::{self, Pin as GpioPin}; use crate::gpio::{self, Pin as GpioPin};
use crate::interrupt::{Interrupt, InterruptExt}; use crate::interrupt::{Interrupt, InterruptExt};
@ -82,6 +83,8 @@ pub struct Config {
pub spi_mode: SpiMode, pub spi_mode: SpiMode,
/// Addressing mode (24-bit or 32-bit) /// Addressing mode (24-bit or 32-bit)
pub address_mode: AddressMode, pub address_mode: AddressMode,
/// Flash memory capacity in bytes. This is the value reported by the `embedded-storage` traits.
pub capacity: u32,
} }
impl Default for Config { impl Default for Config {
@ -96,6 +99,7 @@ impl Default for Config {
sck_delay: 80, sck_delay: 80,
spi_mode: SpiMode::MODE0, spi_mode: SpiMode::MODE0,
address_mode: AddressMode::_24BIT, address_mode: AddressMode::_24BIT,
capacity: 0,
} }
} }
} }
@ -111,12 +115,13 @@ pub enum Error {
} }
/// QSPI flash driver. /// QSPI flash driver.
pub struct Qspi<'d, T: Instance, const FLASH_SIZE: u32> { pub struct Qspi<'d, T: Instance> {
irq: PeripheralRef<'d, T::Interrupt>, irq: PeripheralRef<'d, T::Interrupt>,
dpm_enabled: bool, dpm_enabled: bool,
capacity: u32,
} }
impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> Qspi<'d, T> {
/// Create a new QSPI driver. /// Create a new QSPI driver.
pub fn new( pub fn new(
_qspi: impl Peripheral<P = T> + 'd, _qspi: impl Peripheral<P = T> + 'd,
@ -128,7 +133,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
io2: impl Peripheral<P = impl GpioPin> + 'd, io2: impl Peripheral<P = impl GpioPin> + 'd,
io3: impl Peripheral<P = impl GpioPin> + 'd, io3: impl Peripheral<P = impl GpioPin> + 'd,
config: Config, config: Config,
) -> Qspi<'d, T, FLASH_SIZE> { ) -> Self {
into_ref!(irq, sck, csn, io0, io1, io2, io3); into_ref!(irq, sck, csn, io0, io1, io2, io3);
let r = T::regs(); let r = T::regs();
@ -194,6 +199,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
let res = Self { let res = Self {
dpm_enabled: config.deep_power_down.is_some(), dpm_enabled: config.deep_power_down.is_some(),
irq, irq,
capacity: config.capacity,
}; };
r.events_ready.reset(); r.events_ready.reset();
@ -326,7 +332,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
assert_eq!(data.as_ptr() as u32 % 4, 0); assert_eq!(data.as_ptr() as u32 % 4, 0);
assert_eq!(data.len() as u32 % 4, 0); assert_eq!(data.len() as u32 % 4, 0);
assert_eq!(address % 4, 0); assert_eq!(address % 4, 0);
if address > FLASH_SIZE { if address > self.capacity {
return Err(Error::OutOfBounds); return Err(Error::OutOfBounds);
} }
@ -348,7 +354,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
assert_eq!(data.len() as u32 % 4, 0); assert_eq!(data.len() as u32 % 4, 0);
assert_eq!(address % 4, 0); assert_eq!(address % 4, 0);
if address > FLASH_SIZE { if address > self.capacity {
return Err(Error::OutOfBounds); return Err(Error::OutOfBounds);
} }
@ -366,7 +372,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
fn start_erase(&mut self, address: u32) -> Result<(), Error> { fn start_erase(&mut self, address: u32) -> Result<(), Error> {
assert_eq!(address % 4096, 0); assert_eq!(address % 4096, 0);
if address > FLASH_SIZE { if address > self.capacity {
return Err(Error::OutOfBounds); return Err(Error::OutOfBounds);
} }
@ -439,7 +445,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Qspi<'d, T, FLASH_SIZE> {
} }
} }
impl<'d, T: Instance, const FLASH_SIZE: u32> Drop for Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> Drop for Qspi<'d, T> {
fn drop(&mut self) { fn drop(&mut self) {
let r = T::regs(); let r = T::regs();
@ -484,9 +490,7 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> Drop for Qspi<'d, T, FLASH_SIZE> {
} }
} }
use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash}; impl<'d, T: Instance> ErrorType for Qspi<'d, T> {
impl<'d, T: Instance, const FLASH_SIZE: u32> ErrorType for Qspi<'d, T, FLASH_SIZE> {
type Error = Error; type Error = Error;
} }
@ -496,7 +500,7 @@ impl NorFlashError for Error {
} }
} }
impl<'d, T: Instance, const FLASH_SIZE: u32> ReadNorFlash for Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> ReadNorFlash for Qspi<'d, T> {
const READ_SIZE: usize = 4; const READ_SIZE: usize = 4;
fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> { fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> {
@ -505,11 +509,11 @@ impl<'d, T: Instance, const FLASH_SIZE: u32> ReadNorFlash for Qspi<'d, T, FLASH_
} }
fn capacity(&self) -> usize { fn capacity(&self) -> usize {
FLASH_SIZE as usize self.capacity as usize
} }
} }
impl<'d, T: Instance, const FLASH_SIZE: u32> NorFlash for Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> NorFlash for Qspi<'d, T> {
const WRITE_SIZE: usize = 4; const WRITE_SIZE: usize = 4;
const ERASE_SIZE: usize = 4096; const ERASE_SIZE: usize = 4096;
@ -534,7 +538,7 @@ mod _eh1 {
use super::*; use super::*;
impl<'d, T: Instance, const FLASH_SIZE: u32> AsyncNorFlash for Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> AsyncNorFlash for Qspi<'d, T> {
const WRITE_SIZE: usize = <Self as NorFlash>::WRITE_SIZE; const WRITE_SIZE: usize = <Self as NorFlash>::WRITE_SIZE;
const ERASE_SIZE: usize = <Self as NorFlash>::ERASE_SIZE; const ERASE_SIZE: usize = <Self as NorFlash>::ERASE_SIZE;
@ -554,7 +558,7 @@ mod _eh1 {
} }
} }
impl<'d, T: Instance, const FLASH_SIZE: u32> AsyncReadNorFlash for Qspi<'d, T, FLASH_SIZE> { impl<'d, T: Instance> AsyncReadNorFlash for Qspi<'d, T> {
const READ_SIZE: usize = 4; const READ_SIZE: usize = 4;
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a; type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
fn read<'a>(&'a mut self, address: u32, data: &'a mut [u8]) -> Self::ReadFuture<'a> { fn read<'a>(&'a mut self, address: u32, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
@ -562,7 +566,7 @@ mod _eh1 {
} }
fn capacity(&self) -> usize { fn capacity(&self) -> usize {
FLASH_SIZE as usize self.capacity as usize
} }
} }
} }

View file

@ -24,7 +24,7 @@ async fn main(_spawner: Spawner) {
config.write_page_size = qspi::WritePageSize::_256BYTES; config.write_page_size = qspi::WritePageSize::_256BYTES;
let irq = interrupt::take!(QSPI); let irq = interrupt::take!(QSPI);
let mut q: qspi::Qspi<_, 67108864> = qspi::Qspi::new( let mut q = qspi::Qspi::new(
p.QSPI, irq, p.P0_19, p.P0_17, p.P0_20, p.P0_21, p.P0_22, p.P0_23, config, p.QSPI, irq, p.P0_19, p.P0_17, p.P0_20, p.P0_21, p.P0_22, p.P0_23, config,
); );

View file

@ -31,7 +31,7 @@ async fn main(_p: Spawner) {
exit_time: 3, // tRDP = 35uS exit_time: 3, // tRDP = 35uS
}); });
let mut q: qspi::Qspi<_, 67108864> = qspi::Qspi::new( let mut q = qspi::Qspi::new(
&mut p.QSPI, &mut p.QSPI,
&mut irq, &mut irq,
&mut p.P0_19, &mut p.P0_19,