aboutsummaryrefslogtreecommitdiff
path: root/examples/rp/src/bin/flash.rs
diff options
context:
space:
mode:
authorDerek Hageman <[email protected]>2023-07-25 15:54:33 -0600
committerDerek Hageman <[email protected]>2023-07-28 16:50:54 -0600
commit7ed9e29326e42bf286b4f7c5883ef216cfb21531 (patch)
tree7df710710db22c9ba77c6149be6a78aa5d7c7d23 /examples/rp/src/bin/flash.rs
parente3cc0d168c1455d63df55f758cd875d78120f04d (diff)
rp: add async flash
Implement an async flash mode using the XIP background best effort read interface. Only reads are actually async, write and erase remain blocking.
Diffstat (limited to 'examples/rp/src/bin/flash.rs')
-rw-r--r--examples/rp/src/bin/flash.rs42
1 files changed, 38 insertions, 4 deletions
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
7use defmt::*; 7use defmt::*;
8use embassy_executor::Spawner; 8use embassy_executor::Spawner;
9use embassy_rp::flash::{ERASE_SIZE, FLASH_BASE}; 9use embassy_rp::flash::{Async, ERASE_SIZE, FLASH_BASE};
10use embassy_rp::peripherals::FLASH; 10use embassy_rp::peripherals::FLASH;
11use embassy_time::{Duration, Timer}; 11use embassy_time::{Duration, Timer};
12use {defmt_rtt as _, panic_probe as _}; 12use {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
46fn multiwrite_bytes(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE>, offset: u32) { 48fn 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
74fn erase_write_sector(flash: &mut embassy_rp::flash::Flash<'_, FLASH, FLASH_SIZE>, offset: u32) { 76fn 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
105async 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}