diff options
Diffstat (limited to 'embassy-stm32/src/sdmmc/sd.rs')
| -rw-r--r-- | embassy-stm32/src/sdmmc/sd.rs | 58 |
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}; | |||
| 5 | use sdio_host::sd::{BusWidth, CIC, CID, CSD, CardCapacity, CardStatus, CurrentState, OCR, RCA, SCR, SD, SDStatus}; | 5 | use sdio_host::sd::{BusWidth, CIC, CID, CSD, CardCapacity, CardStatus, CurrentState, OCR, RCA, SCR, SD, SDStatus}; |
| 6 | use sdio_host::{common_cmd, emmc_cmd, sd_cmd}; | 6 | use sdio_host::{common_cmd, emmc_cmd, sd_cmd}; |
| 7 | 7 | ||
| 8 | use crate::sdmmc::{BlockSize, Error, Sdmmc, Signalling, block_size, bus_width_vals, slice8_mut, slice8_ref}; | 8 | use crate::sdmmc::{ |
| 9 | BlockSize, DatapathMode, Error, Sdmmc, Signalling, aligned_mut, aligned_ref, block_size, bus_width_vals, | ||
| 10 | slice8_mut, slice8_ref, | ||
| 11 | }; | ||
| 9 | use crate::time::{Hertz, mhz}; | 12 | use 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 | ||
