diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-04-05 01:41:47 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-04-05 01:41:47 +0200 |
| commit | c2b8ddaa83d251395a974094b2afc4550204249f (patch) | |
| tree | 1592d21f99757dcf5f3d379bba3f39a65e42ece4 | |
| parent | 485bfd165ce77c6e1dc60929f4beaa88b73d21d7 (diff) | |
stm32/qspi: autodeduce transfer len from buffer len.
mirrors change made in #2672.
| -rw-r--r-- | embassy-stm32/src/qspi/mod.rs | 53 |
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 | ||
| 34 | impl Default for TransferConfig { | 32 | impl 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 | ||
