diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-07-28 22:56:33 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-28 22:56:33 +0000 |
| commit | eb097b9d03fe906c4ee4cbe0f3eb3dbbe621d56f (patch) | |
| tree | bd5e8f050930e660006f85099ede9376214a77c8 /examples | |
| parent | bdc4aa4a3beeeecb9860644f8421bba6c8ab0cf2 (diff) | |
| parent | 7ed9e29326e42bf286b4f7c5883ef216cfb21531 (diff) | |
Merge pull request #1710 from Sizurka/rp-async-flash
rp: add async flash
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/boot/application/rp/src/bin/a.rs | 4 | ||||
| -rw-r--r-- | examples/rp/src/bin/flash.rs | 42 |
2 files changed, 40 insertions, 6 deletions
diff --git a/examples/boot/application/rp/src/bin/a.rs b/examples/boot/application/rp/src/bin/a.rs index c8497494c..b5e1950cc 100644 --- a/examples/boot/application/rp/src/bin/a.rs +++ b/examples/boot/application/rp/src/bin/a.rs | |||
| @@ -7,7 +7,7 @@ use core::cell::RefCell; | |||
| 7 | use defmt_rtt as _; | 7 | use defmt_rtt as _; |
| 8 | use embassy_boot_rp::*; | 8 | use embassy_boot_rp::*; |
| 9 | use embassy_executor::Spawner; | 9 | use embassy_executor::Spawner; |
| 10 | use embassy_rp::flash::Flash; | 10 | use embassy_rp::flash::{self, Flash}; |
| 11 | use embassy_rp::gpio::{Level, Output}; | 11 | use embassy_rp::gpio::{Level, Output}; |
| 12 | use embassy_rp::watchdog::Watchdog; | 12 | use embassy_rp::watchdog::Watchdog; |
| 13 | use embassy_sync::blocking_mutex::Mutex; | 13 | use embassy_sync::blocking_mutex::Mutex; |
| @@ -34,7 +34,7 @@ async fn main(_s: Spawner) { | |||
| 34 | let mut watchdog = Watchdog::new(p.WATCHDOG); | 34 | let mut watchdog = Watchdog::new(p.WATCHDOG); |
| 35 | watchdog.start(Duration::from_secs(8)); | 35 | watchdog.start(Duration::from_secs(8)); |
| 36 | 36 | ||
| 37 | let flash: Flash<_, FLASH_SIZE> = Flash::new(p.FLASH); | 37 | let flash = Flash::<_, flash::Blocking, FLASH_SIZE>::new(p.FLASH); |
| 38 | let flash = Mutex::new(RefCell::new(flash)); | 38 | let flash = Mutex::new(RefCell::new(flash)); |
| 39 | 39 | ||
| 40 | let config = FirmwareUpdaterConfig::from_linkerfile_blocking(&flash); | 40 | let config = FirmwareUpdaterConfig::from_linkerfile_blocking(&flash); |
diff --git a/examples/rp/src/bin/flash.rs b/examples/rp/src/bin/flash.rs index 4c4982acc..88bb931d2 100644 --- a/examples/rp/src/bin/flash.rs +++ b/examples/rp/src/bin/flash.rs | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | use defmt::*; | 7 | use defmt::*; |
| 8 | use embassy_executor::Spawner; | 8 | use embassy_executor::Spawner; |
| 9 | use embassy_rp::flash::{ERASE_SIZE, FLASH_BASE}; | 9 | use embassy_rp::flash::{Async, ERASE_SIZE, FLASH_BASE}; |
| 10 | use embassy_rp::peripherals::FLASH; | 10 | use embassy_rp::peripherals::FLASH; |
| 11 | use embassy_time::{Duration, Timer}; | 11 | use embassy_time::{Duration, Timer}; |
| 12 | use {defmt_rtt as _, panic_probe as _}; | 12 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -25,7 +25,7 @@ async fn main(_spawner: Spawner) { | |||
| 25 | // https://github.com/knurling-rs/defmt/pull/683 | 25 | // https://github.com/knurling-rs/defmt/pull/683 |
| 26 | Timer::after(Duration::from_millis(10)).await; | 26 | Timer::after(Duration::from_millis(10)).await; |
| 27 | 27 | ||
| 28 | let mut flash = embassy_rp::flash::Flash::<_, FLASH_SIZE>::new(p.FLASH); | 28 | let mut flash = embassy_rp::flash::Flash::<_, Async, FLASH_SIZE>::new(p.FLASH, p.DMA_CH0); |
| 29 | 29 | ||
| 30 | // Get JEDEC id | 30 | // Get JEDEC id |
| 31 | let jedec = flash.jedec_id().unwrap(); | 31 | let jedec = flash.jedec_id().unwrap(); |
| @@ -40,10 +40,12 @@ async fn main(_spawner: Spawner) { | |||
| 40 | 40 | ||
| 41 | multiwrite_bytes(&mut flash, ERASE_SIZE as u32); | 41 | multiwrite_bytes(&mut flash, ERASE_SIZE as u32); |
| 42 | 42 | ||
| 43 | background_read(&mut flash, (ERASE_SIZE * 2) as u32).await; | ||
| 44 | |||
| 43 | loop {} | 45 | loop {} |
| 44 | } | 46 | } |
| 45 | 47 | ||
| 46 | fn multiwrite_bytes(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE>, offset: u32) { | 48 | fn multiwrite_bytes(flash: &mut embassy_rp::flash::Flash<'_, FLASH, Async, FLASH_SIZE>, offset: u32) { |
| 47 | info!(">>>> [multiwrite_bytes]"); | 49 | info!(">>>> [multiwrite_bytes]"); |
| 48 | let mut read_buf = [0u8; ERASE_SIZE]; | 50 | let mut read_buf = [0u8; ERASE_SIZE]; |
| 49 | defmt::unwrap!(flash.read(ADDR_OFFSET + offset, &mut read_buf)); | 51 | defmt::unwrap!(flash.read(ADDR_OFFSET + offset, &mut read_buf)); |
| @@ -71,7 +73,7 @@ fn multiwrite_bytes(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE>, | |||
| 71 | } | 73 | } |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | fn erase_write_sector(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE>, offset: u32) { | 76 | fn erase_write_sector(flash: &mut embassy_rp::flash::Flash<'_, FLASH, Async, FLASH_SIZE>, offset: u32) { |
| 75 | info!(">>>> [erase_write_sector]"); | 77 | info!(">>>> [erase_write_sector]"); |
| 76 | let mut buf = [0u8; ERASE_SIZE]; | 78 | let mut buf = [0u8; ERASE_SIZE]; |
| 77 | defmt::unwrap!(flash.read(ADDR_OFFSET + offset, &mut buf)); | 79 | defmt::unwrap!(flash.read(ADDR_OFFSET + offset, &mut buf)); |
| @@ -99,3 +101,35 @@ fn erase_write_sector(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE | |||
| 99 | defmt::panic!("unexpected"); | 101 | defmt::panic!("unexpected"); |
| 100 | } | 102 | } |
| 101 | } | 103 | } |
| 104 | |||
| 105 | async fn background_read(flash: &mut embassy_rp::flash::Flash<'_, FLASH, Async, FLASH_SIZE>, offset: u32) { | ||
| 106 | info!(">>>> [background_read]"); | ||
| 107 | |||
| 108 | let mut buf = [0u32; 8]; | ||
| 109 | defmt::unwrap!(flash.background_read(ADDR_OFFSET + offset, &mut buf)).await; | ||
| 110 | |||
| 111 | info!("Addr of flash block is {:x}", ADDR_OFFSET + offset + FLASH_BASE as u32); | ||
| 112 | info!("Contents start with {=u32:x}", buf[0]); | ||
| 113 | |||
| 114 | defmt::unwrap!(flash.erase(ADDR_OFFSET + offset, ADDR_OFFSET + offset + ERASE_SIZE as u32)); | ||
| 115 | |||
| 116 | defmt::unwrap!(flash.background_read(ADDR_OFFSET + offset, &mut buf)).await; | ||
| 117 | info!("Contents after erase starts with {=u32:x}", buf[0]); | ||
| 118 | if buf.iter().any(|x| *x != 0xFFFFFFFF) { | ||
| 119 | defmt::panic!("unexpected"); | ||
| 120 | } | ||
| 121 | |||
| 122 | for b in buf.iter_mut() { | ||
| 123 | *b = 0xDABA1234; | ||
| 124 | } | ||
| 125 | |||
| 126 | defmt::unwrap!(flash.write(ADDR_OFFSET + offset, unsafe { | ||
| 127 | core::slice::from_raw_parts(buf.as_ptr() as *const u8, buf.len() * 4) | ||
| 128 | })); | ||
| 129 | |||
| 130 | defmt::unwrap!(flash.background_read(ADDR_OFFSET + offset, &mut buf)).await; | ||
| 131 | info!("Contents after write starts with {=u32:x}", buf[0]); | ||
| 132 | if buf.iter().any(|x| *x != 0xDABA1234) { | ||
| 133 | defmt::panic!("unexpected"); | ||
| 134 | } | ||
| 135 | } | ||
