aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32
diff options
context:
space:
mode:
authorBrian Schwind <[email protected]>2025-09-12 20:03:00 +0900
committergoodhoko <[email protected]>2025-09-16 14:28:48 +0200
commite72e17ded8f5f9f10eb68cc785101e5c7dab73ef (patch)
treec73e9465a5d6714dc7253a88427f0d3038784a58 /embassy-stm32
parentec117e3b08e329c0d713dcd493822fbb547eb5aa (diff)
Write data with the Ospi peripheral in chunks to respect the max DMA transfer size
Diffstat (limited to 'embassy-stm32')
-rw-r--r--embassy-stm32/src/ospi/mod.rs42
1 files changed, 24 insertions, 18 deletions
diff --git a/embassy-stm32/src/ospi/mod.rs b/embassy-stm32/src/ospi/mod.rs
index c291a311d..d93cecb69 100644
--- a/embassy-stm32/src/ospi/mod.rs
+++ b/embassy-stm32/src/ospi/mod.rs
@@ -1198,16 +1198,19 @@ impl<'d, T: Instance> Ospi<'d, T, Async> {
1198 .cr() 1198 .cr()
1199 .modify(|v| v.set_fmode(vals::FunctionalMode::INDIRECT_WRITE)); 1199 .modify(|v| v.set_fmode(vals::FunctionalMode::INDIRECT_WRITE));
1200 1200
1201 let transfer = unsafe { 1201 // TODO: implement this using a LinkedList DMA to offload the whole transfer off the CPU.
1202 self.dma 1202 for chunk in buf.chunks(0xFFFF) {
1203 .as_mut() 1203 let transfer = unsafe {
1204 .unwrap() 1204 self.dma
1205 .write(buf, T::REGS.dr().as_ptr() as *mut W, Default::default()) 1205 .as_mut()
1206 }; 1206 .unwrap()
1207 1207 .write(chunk, T::REGS.dr().as_ptr() as *mut W, Default::default())
1208 T::REGS.cr().modify(|w| w.set_dmaen(true)); 1208 };
1209 1209
1210 transfer.blocking_wait(); 1210 T::REGS.cr().modify(|w| w.set_dmaen(true));
1211
1212 transfer.blocking_wait();
1213 }
1211 1214
1212 finish_dma(T::REGS); 1215 finish_dma(T::REGS);
1213 1216
@@ -1268,16 +1271,19 @@ impl<'d, T: Instance> Ospi<'d, T, Async> {
1268 .cr() 1271 .cr()
1269 .modify(|v| v.set_fmode(vals::FunctionalMode::INDIRECT_WRITE)); 1272 .modify(|v| v.set_fmode(vals::FunctionalMode::INDIRECT_WRITE));
1270 1273
1271 let transfer = unsafe { 1274 // TODO: implement this using a LinkedList DMA to offload the whole transfer off the CPU.
1272 self.dma 1275 for chunk in buf.chunks(0xFFFF) {
1273 .as_mut() 1276 let transfer = unsafe {
1274 .unwrap() 1277 self.dma
1275 .write(buf, T::REGS.dr().as_ptr() as *mut W, Default::default()) 1278 .as_mut()
1276 }; 1279 .unwrap()
1280 .write(chunk, T::REGS.dr().as_ptr() as *mut W, Default::default())
1281 };
1277 1282
1278 T::REGS.cr().modify(|w| w.set_dmaen(true)); 1283 T::REGS.cr().modify(|w| w.set_dmaen(true));
1279 1284
1280 transfer.await; 1285 transfer.await;
1286 }
1281 1287
1282 finish_dma(T::REGS); 1288 finish_dma(T::REGS);
1283 1289