aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-04-04 23:47:02 +0000
committerGitHub <[email protected]>2024-04-04 23:47:02 +0000
commit20110ce6c7039de5f4b138fb6baff501b91751ae (patch)
tree1592d21f99757dcf5f3d379bba3f39a65e42ece4
parent485bfd165ce77c6e1dc60929f4beaa88b73d21d7 (diff)
parentc2b8ddaa83d251395a974094b2afc4550204249f (diff)
Merge pull request #2775 from embassy-rs/qspi-autolen
stm32/qspi: autodeduce transfer len from buffer len.
-rw-r--r--embassy-stm32/src/qspi/mod.rs53
1 files changed, 23 insertions, 30 deletions
diff --git a/embassy-stm32/src/qspi/mod.rs b/embassy-stm32/src/qspi/mod.rs
index 3c054e666..0a4b4f074 100644
--- a/embassy-stm32/src/qspi/mod.rs
+++ b/embassy-stm32/src/qspi/mod.rs
@@ -27,8 +27,6 @@ pub struct TransferConfig {
27 pub address: Option<u32>, 27 pub address: Option<u32>,
28 /// Number of dummy cycles (DCYC) 28 /// Number of dummy cycles (DCYC)
29 pub dummy: DummyCycles, 29 pub dummy: DummyCycles,
30 /// Length of data
31 pub data_len: Option<usize>,
32} 30}
33 31
34impl Default for TransferConfig { 32impl Default for TransferConfig {
@@ -40,7 +38,6 @@ impl Default for TransferConfig {
40 instruction: 0, 38 instruction: 0,
41 address: None, 39 address: None,
42 dummy: DummyCycles::_0, 40 dummy: DummyCycles::_0,
43 data_len: None,
44 } 41 }
45 } 42 }
46} 43}
@@ -231,7 +228,7 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
231 pub fn command(&mut self, transaction: TransferConfig) { 228 pub fn command(&mut self, transaction: TransferConfig) {
232 #[cfg(not(stm32h7))] 229 #[cfg(not(stm32h7))]
233 T::REGS.cr().modify(|v| v.set_dmaen(false)); 230 T::REGS.cr().modify(|v| v.set_dmaen(false));
234 self.setup_transaction(QspiMode::IndirectWrite, &transaction); 231 self.setup_transaction(QspiMode::IndirectWrite, &transaction, None);
235 232
236 while !T::REGS.sr().read().tcf() {} 233 while !T::REGS.sr().read().tcf() {}
237 T::REGS.fcr().modify(|v| v.set_ctcf(true)); 234 T::REGS.fcr().modify(|v| v.set_ctcf(true));
@@ -241,21 +238,19 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
241 pub fn blocking_read(&mut self, buf: &mut [u8], transaction: TransferConfig) { 238 pub fn blocking_read(&mut self, buf: &mut [u8], transaction: TransferConfig) {
242 #[cfg(not(stm32h7))] 239 #[cfg(not(stm32h7))]
243 T::REGS.cr().modify(|v| v.set_dmaen(false)); 240 T::REGS.cr().modify(|v| v.set_dmaen(false));
244 self.setup_transaction(QspiMode::IndirectWrite, &transaction); 241 self.setup_transaction(QspiMode::IndirectWrite, &transaction, Some(buf.len()));
245 242
246 if let Some(len) = transaction.data_len { 243 let current_ar = T::REGS.ar().read().address();
247 let current_ar = T::REGS.ar().read().address(); 244 T::REGS.ccr().modify(|v| {
248 T::REGS.ccr().modify(|v| { 245 v.set_fmode(QspiMode::IndirectRead.into());
249 v.set_fmode(QspiMode::IndirectRead.into()); 246 });
250 }); 247 T::REGS.ar().write(|v| {
251 T::REGS.ar().write(|v| { 248 v.set_address(current_ar);
252 v.set_address(current_ar); 249 });
253 });
254 250
255 for idx in 0..len { 251 for b in buf {
256 while !T::REGS.sr().read().tcf() && !T::REGS.sr().read().ftf() {} 252 while !T::REGS.sr().read().tcf() && !T::REGS.sr().read().ftf() {}
257 buf[idx] = unsafe { (T::REGS.dr().as_ptr() as *mut u8).read_volatile() }; 253 *b = unsafe { (T::REGS.dr().as_ptr() as *mut u8).read_volatile() };
258 }
259 } 254 }
260 255
261 while !T::REGS.sr().read().tcf() {} 256 while !T::REGS.sr().read().tcf() {}
@@ -268,17 +263,15 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
268 #[cfg(not(stm32h7))] 263 #[cfg(not(stm32h7))]
269 T::REGS.cr().modify(|v| v.set_dmaen(false)); 264 T::REGS.cr().modify(|v| v.set_dmaen(false));
270 265
271 self.setup_transaction(QspiMode::IndirectWrite, &transaction); 266 self.setup_transaction(QspiMode::IndirectWrite, &transaction, Some(buf.len()));
272 267
273 if let Some(len) = transaction.data_len { 268 T::REGS.ccr().modify(|v| {
274 T::REGS.ccr().modify(|v| { 269 v.set_fmode(QspiMode::IndirectWrite.into());
275 v.set_fmode(QspiMode::IndirectWrite.into()); 270 });
276 });
277 271
278 for idx in 0..len { 272 for &b in buf {
279 while !T::REGS.sr().read().ftf() {} 273 while !T::REGS.sr().read().ftf() {}
280 unsafe { (T::REGS.dr().as_ptr() as *mut u8).write_volatile(buf[idx]) }; 274 unsafe { (T::REGS.dr().as_ptr() as *mut u8).write_volatile(b) };
281 }
282 } 275 }
283 276
284 while !T::REGS.sr().read().tcf() {} 277 while !T::REGS.sr().read().tcf() {}
@@ -290,7 +283,7 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
290 where 283 where
291 Dma: QuadDma<T>, 284 Dma: QuadDma<T>,
292 { 285 {
293 self.setup_transaction(QspiMode::IndirectWrite, &transaction); 286 self.setup_transaction(QspiMode::IndirectWrite, &transaction, Some(buf.len()));
294 287
295 T::REGS.ccr().modify(|v| { 288 T::REGS.ccr().modify(|v| {
296 v.set_fmode(QspiMode::IndirectRead.into()); 289 v.set_fmode(QspiMode::IndirectRead.into());
@@ -323,7 +316,7 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
323 where 316 where
324 Dma: QuadDma<T>, 317 Dma: QuadDma<T>,
325 { 318 {
326 self.setup_transaction(QspiMode::IndirectWrite, &transaction); 319 self.setup_transaction(QspiMode::IndirectWrite, &transaction, Some(buf.len()));
327 320
328 T::REGS.ccr().modify(|v| { 321 T::REGS.ccr().modify(|v| {
329 v.set_fmode(QspiMode::IndirectWrite.into()); 322 v.set_fmode(QspiMode::IndirectWrite.into());
@@ -347,7 +340,7 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
347 transfer.blocking_wait(); 340 transfer.blocking_wait();
348 } 341 }
349 342
350 fn setup_transaction(&mut self, fmode: QspiMode, transaction: &TransferConfig) { 343 fn setup_transaction(&mut self, fmode: QspiMode, transaction: &TransferConfig, data_len: Option<usize>) {
351 T::REGS.fcr().modify(|v| { 344 T::REGS.fcr().modify(|v| {
352 v.set_csmf(true); 345 v.set_csmf(true);
353 v.set_ctcf(true); 346 v.set_ctcf(true);
@@ -357,7 +350,7 @@ impl<'d, T: Instance, Dma> Qspi<'d, T, Dma> {
357 350
358 while T::REGS.sr().read().busy() {} 351 while T::REGS.sr().read().busy() {}
359 352
360 if let Some(len) = transaction.data_len { 353 if let Some(len) = data_len {
361 T::REGS.dlr().write(|v| v.set_dl(len as u32 - 1)); 354 T::REGS.dlr().write(|v| v.set_dl(len as u32 - 1));
362 } 355 }
363 356