aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/sdmmc/sd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/sdmmc/sd.rs')
-rw-r--r--embassy-stm32/src/sdmmc/sd.rs58
1 files changed, 32 insertions, 26 deletions
diff --git a/embassy-stm32/src/sdmmc/sd.rs b/embassy-stm32/src/sdmmc/sd.rs
index 6190226b8..20318bbfa 100644
--- a/embassy-stm32/src/sdmmc/sd.rs
+++ b/embassy-stm32/src/sdmmc/sd.rs
@@ -5,7 +5,10 @@ use sdio_host::emmc::{EMMC, ExtCSD};
5use sdio_host::sd::{BusWidth, CIC, CID, CSD, CardCapacity, CardStatus, CurrentState, OCR, RCA, SCR, SD, SDStatus}; 5use sdio_host::sd::{BusWidth, CIC, CID, CSD, CardCapacity, CardStatus, CurrentState, OCR, RCA, SCR, SD, SDStatus};
6use sdio_host::{common_cmd, emmc_cmd, sd_cmd}; 6use sdio_host::{common_cmd, emmc_cmd, sd_cmd};
7 7
8use crate::sdmmc::{BlockSize, Error, Sdmmc, Signalling, block_size, bus_width_vals, slice8_mut, slice8_ref}; 8use crate::sdmmc::{
9 BlockSize, DatapathMode, Error, Sdmmc, Signalling, aligned_mut, aligned_ref, block_size, bus_width_vals,
10 slice8_mut, slice8_ref,
11};
9use crate::time::{Hertz, mhz}; 12use crate::time::{Hertz, mhz};
10 13
11/// Aligned data block for SDMMC transfers. 14/// Aligned data block for SDMMC transfers.
@@ -230,10 +233,8 @@ impl<'a, 'b> StorageDevice<'a, 'b, Card> {
230 }; 233 };
231 234
232 let buffer = &mut cmd_block.0[..64 / 4]; 235 let buffer = &mut cmd_block.0[..64 / 4];
233 236 let mode = DatapathMode::Block(block_size(size_of_val(buffer)));
234 let transfer = self 237 let transfer = self.sdmmc.prepare_datapath_read(aligned_mut(buffer), mode);
235 .sdmmc
236 .prepare_datapath_read(buffer, block_size(size_of_val(buffer)), false);
237 238
238 self.sdmmc.cmd(sd_cmd::cmd6(set_function), true)?; // CMD6 239 self.sdmmc.cmd(sd_cmd::cmd6(set_function), true)?; // CMD6
239 240
@@ -272,7 +273,9 @@ impl<'a, 'b> StorageDevice<'a, 'b, Card> {
272 273
273 // Arm `OnDrop` after the buffer, so it will be dropped first 274 // Arm `OnDrop` after the buffer, so it will be dropped first
274 275
275 let transfer = self.sdmmc.prepare_datapath_read(scr, BlockSize::Size8, false); 276 let transfer = self
277 .sdmmc
278 .prepare_datapath_read(aligned_mut(scr), DatapathMode::Block(BlockSize::Size8));
276 self.sdmmc.cmd(sd_cmd::send_scr(), true)?; 279 self.sdmmc.cmd(sd_cmd::send_scr(), true)?;
277 280
278 self.sdmmc.complete_datapath_transfer(transfer, true).await?; 281 self.sdmmc.complete_datapath_transfer(transfer, true).await?;
@@ -290,10 +293,9 @@ impl<'a, 'b> StorageDevice<'a, 'b, Card> {
290 self.sdmmc.cmd(common_cmd::app_cmd(rca), false)?; // APP 293 self.sdmmc.cmd(common_cmd::app_cmd(rca), false)?; // APP
291 294
292 let buffer = &mut cmd_block.as_mut()[..64 / 4]; 295 let buffer = &mut cmd_block.as_mut()[..64 / 4];
296 let mode = DatapathMode::Block(block_size(size_of_val(buffer)));
293 297
294 let transfer = self 298 let transfer = self.sdmmc.prepare_datapath_read(aligned_mut(buffer), mode);
295 .sdmmc
296 .prepare_datapath_read(buffer, block_size(size_of_val(buffer)), false);
297 self.sdmmc.cmd(sd_cmd::sd_status(), true)?; 299 self.sdmmc.cmd(sd_cmd::sd_status(), true)?;
298 300
299 self.sdmmc.complete_datapath_transfer(transfer, true).await?; 301 self.sdmmc.complete_datapath_transfer(transfer, true).await?;
@@ -398,9 +400,10 @@ impl<'a, 'b> StorageDevice<'a, 'b, Emmc> {
398 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false) 400 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false)
399 .unwrap(); // CMD16 401 .unwrap(); // CMD16
400 402
401 let transfer = self 403 let transfer = self.sdmmc.prepare_datapath_read(
402 .sdmmc 404 aligned_mut(&mut data_block.0),
403 .prepare_datapath_read(&mut data_block.0, block_size(size_of::<DataBlock>()), false); 405 DatapathMode::Block(block_size(size_of::<DataBlock>())),
406 );
404 self.sdmmc.cmd(emmc_cmd::send_ext_csd(), true)?; 407 self.sdmmc.cmd(emmc_cmd::send_ext_csd(), true)?;
405 408
406 self.sdmmc.complete_datapath_transfer(transfer, true).await?; 409 self.sdmmc.complete_datapath_transfer(transfer, true).await?;
@@ -418,7 +421,7 @@ impl<'a, 'b, A: Addressable> StorageDevice<'a, 'b, A> {
418 421
419 /// Read a data block. 422 /// Read a data block.
420 #[inline] 423 #[inline]
421 pub async fn read_block(&mut self, block_idx: u32, buffer: &mut DataBlock) -> Result<(), Error> { 424 pub async fn read_block(&mut self, block_idx: u32, data_block: &mut DataBlock) -> Result<(), Error> {
422 let _scoped_block_stop = self.sdmmc.info.rcc.block_stop(); 425 let _scoped_block_stop = self.sdmmc.info.rcc.block_stop();
423 let card_capacity = self.info.get_capacity(); 426 let card_capacity = self.info.get_capacity();
424 427
@@ -431,9 +434,10 @@ impl<'a, 'b, A: Addressable> StorageDevice<'a, 'b, A> {
431 self.sdmmc 434 self.sdmmc
432 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false)?; // CMD16 435 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false)?; // CMD16
433 436
434 let transfer = self 437 let transfer = self.sdmmc.prepare_datapath_read(
435 .sdmmc 438 aligned_mut(&mut data_block.0),
436 .prepare_datapath_read(&mut buffer.0, block_size(size_of::<DataBlock>()), false); 439 DatapathMode::Block(block_size(size_of::<DataBlock>())),
440 );
437 self.sdmmc.cmd(common_cmd::read_single_block(address), true)?; 441 self.sdmmc.cmd(common_cmd::read_single_block(address), true)?;
438 442
439 self.sdmmc.complete_datapath_transfer(transfer, true).await?; 443 self.sdmmc.complete_datapath_transfer(transfer, true).await?;
@@ -464,9 +468,10 @@ impl<'a, 'b, A: Addressable> StorageDevice<'a, 'b, A> {
464 self.sdmmc 468 self.sdmmc
465 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false)?; // CMD16 469 .cmd(common_cmd::set_block_length(size_of::<DataBlock>() as u32), false)?; // CMD16
466 470
467 let transfer = self 471 let transfer = self.sdmmc.prepare_datapath_read(
468 .sdmmc 472 aligned_mut(buffer),
469 .prepare_datapath_read(buffer, block_size(size_of::<DataBlock>()), false); 473 DatapathMode::Block(block_size(size_of::<DataBlock>())),
474 );
470 self.sdmmc.cmd(common_cmd::read_multiple_blocks(address), true)?; 475 self.sdmmc.cmd(common_cmd::read_multiple_blocks(address), true)?;
471 476
472 self.sdmmc.complete_datapath_transfer(transfer, false).await?; 477 self.sdmmc.complete_datapath_transfer(transfer, false).await?;
@@ -497,9 +502,10 @@ impl<'a, 'b, A: Addressable> StorageDevice<'a, 'b, A> {
497 #[cfg(sdmmc_v1)] 502 #[cfg(sdmmc_v1)]
498 self.sdmmc.cmd(common_cmd::write_single_block(address), true)?; 503 self.sdmmc.cmd(common_cmd::write_single_block(address), true)?;
499 504
500 let transfer = self 505 let transfer = self.sdmmc.prepare_datapath_write(
501 .sdmmc 506 aligned_ref(&buffer.0),
502 .prepare_datapath_write(&buffer.0, block_size(size_of::<DataBlock>()), false); 507 DatapathMode::Block(block_size(size_of::<DataBlock>())),
508 );
503 509
504 #[cfg(sdmmc_v2)] 510 #[cfg(sdmmc_v2)]
505 self.sdmmc.cmd(common_cmd::write_single_block(address), true)?; 511 self.sdmmc.cmd(common_cmd::write_single_block(address), true)?;
@@ -548,10 +554,10 @@ impl<'a, 'b, A: Addressable> StorageDevice<'a, 'b, A> {
548 self.sdmmc.cmd(common_cmd::write_multiple_blocks(address), true)?; // CMD25 554 self.sdmmc.cmd(common_cmd::write_multiple_blocks(address), true)?; // CMD25
549 555
550 // Setup write command 556 // Setup write command
551 let transfer = self 557 let transfer = self.sdmmc.prepare_datapath_write(
552 .sdmmc 558 aligned_ref(buffer),
553 .prepare_datapath_write(buffer, block_size(size_of::<DataBlock>()), false); 559 DatapathMode::Block(block_size(size_of::<DataBlock>())),
554 560 );
555 #[cfg(sdmmc_v2)] 561 #[cfg(sdmmc_v2)]
556 self.sdmmc.cmd(common_cmd::write_multiple_blocks(address), true)?; // CMD25 562 self.sdmmc.cmd(common_cmd::write_multiple_blocks(address), true)?; // CMD25
557 563