add restore logic for erase test.
diff --git a/target/ast10x0/peripherals/smc/device/flash.rs b/target/ast10x0/peripherals/smc/device/flash.rs index 062409e..3815cfe 100644 --- a/target/ast10x0/peripherals/smc/device/flash.rs +++ b/target/ast10x0/peripherals/smc/device/flash.rs
@@ -508,6 +508,8 @@ self.validate_range(offset, buf.len())?; let translated = self.device_to_controller_offset(offset)?; let cs = self.cs; + //TODO: need to add dma_read variant if buf.len() is above some threshold + // and dma is enabled match &self.backend { FlashBackend::Fmc(fmc) => fmc.read(cs, translated, buf), FlashBackend::Spi(spi) => spi.read(cs, translated, buf),
diff --git a/target/ast10x0/tests/smc/write/target.rs b/target/ast10x0/tests/smc/write/target.rs index ef5eb1d..cee181f 100644 --- a/target/ast10x0/tests/smc/write/target.rs +++ b/target/ast10x0/tests/smc/write/target.rs
@@ -39,6 +39,7 @@ const TEST_OFFSET: u32 = 0x10_0000; const TEST_LEN: usize = 256; +const TEST_SECTOR_LEN: usize = 4096; pub struct Target {} @@ -59,6 +60,22 @@ Ok(()) } +fn restore_sector(flash: &mut SpiNorFlash<'_>, original: &[u8]) -> Result<(), SmcError> { + pw_log::info!("=== restore CS1 sector ==="); + flash.erase_sector(TEST_OFFSET)?; + + let written = flash.program(TEST_OFFSET, original)?; + if written != TEST_SECTOR_LEN { + return Err(SmcError::HardwareError); + } + + if !flash.verify(TEST_OFFSET, original)? { + return Err(SmcError::HardwareError); + } + + Ok(()) +} + fn run_smc_fmc_cs1_write_test() -> Result<(), SmcError> { let scu = unsafe { ScuRegisters::new_global_unlocked() }; scu.apply_pinctrl_group(PINCTRL_FMC_QUAD); @@ -81,8 +98,10 @@ return Err(SmcError::HardwareError); } - let mut flash = SpiNorFlash::from_fmc_cs(&mut fmc, CS1_CONFIG, ChipSelect::Cs1)?; - let jedec = flash.jedec_id()?; + let jedec = { + let flash = SpiNorFlash::from_fmc_cs(&mut fmc, CS1_CONFIG, ChipSelect::Cs1)?; + flash.jedec_id()? + }; pw_log::info!( "CS1 JEDEC ID: {:02x} {:02x} {:02x}", jedec[0] as u32, @@ -90,6 +109,26 @@ jedec[2] as u32 ); + pw_log::info!("=== backup CS1 sector ==="); + let original = unsafe { core::slice::from_raw_parts_mut(0x41000 as *mut u8, TEST_SECTOR_LEN) }; + fmc.dma_read( + ChipSelect::Cs1, + TEST_OFFSET, + 0x41000usize, + TEST_SECTOR_LEN as u32, + )?; + loop { + match fmc.poll_dma_completion() { + core::task::Poll::Pending => {} + core::task::Poll::Ready(result) => { + result?; + break; + } + } + } + + let mut flash = SpiNorFlash::from_fmc_cs(&mut fmc, CS1_CONFIG, ChipSelect::Cs1)?; + pw_log::info!("=== erase CS1 sector ==="); flash.erase_sector(TEST_OFFSET)?; @@ -122,6 +161,8 @@ return Err(SmcError::HardwareError); } + restore_sector(&mut flash, original)?; + dump_smc_register(0x7E62_0000, 16); Ok(()) }