diff options
Diffstat (limited to 'embassy-stm32/src/sdmmc/sdio.rs')
| -rw-r--r-- | embassy-stm32/src/sdmmc/sdio.rs | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/embassy-stm32/src/sdmmc/sdio.rs b/embassy-stm32/src/sdmmc/sdio.rs index 1412b21fc..e436d68cb 100644 --- a/embassy-stm32/src/sdmmc/sdio.rs +++ b/embassy-stm32/src/sdmmc/sdio.rs | |||
| @@ -1,10 +1,11 @@ | |||
| 1 | use core::ops::{Deref, DerefMut}; | 1 | use core::ops::{Deref, DerefMut}; |
| 2 | 2 | ||
| 3 | use aligned::{A4, Aligned}; | ||
| 3 | use sdio_host::common_cmd::{R1, Rz, cmd}; | 4 | use sdio_host::common_cmd::{R1, Rz, cmd}; |
| 4 | use sdio_host::sd::BusWidth; | 5 | use sdio_host::sd::BusWidth; |
| 5 | use sdio_host::sd_cmd; | 6 | use sdio_host::sd_cmd; |
| 6 | 7 | ||
| 7 | use crate::sdmmc::{Error, Sdmmc, block_size, slice8_mut, slice8_ref}; | 8 | use crate::sdmmc::{DatapathMode, Error, Sdmmc, aligned_mut, aligned_ref, block_size, slice8_mut, slice8_ref}; |
| 8 | use crate::time::Hertz; | 9 | use crate::time::Hertz; |
| 9 | 10 | ||
| 10 | /// Aligned data block for SDMMC transfers. | 11 | /// Aligned data block for SDMMC transfers. |
| @@ -39,7 +40,7 @@ impl DerefMut for DataBlock { | |||
| 39 | /// Storage Device | 40 | /// Storage Device |
| 40 | pub struct SerialDataInterface<'a, 'b> { | 41 | pub struct SerialDataInterface<'a, 'b> { |
| 41 | /// Inner member | 42 | /// Inner member |
| 42 | pub sdmmc: &'a mut Sdmmc<'b>, | 43 | sdmmc: &'a mut Sdmmc<'b>, |
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | /// Card Storage Device | 46 | /// Card Storage Device |
| @@ -101,9 +102,10 @@ impl<'a, 'b> SerialDataInterface<'a, 'b> { | |||
| 101 | ) | 102 | ) |
| 102 | }; | 103 | }; |
| 103 | 104 | ||
| 104 | let transfer = self | 105 | let transfer = self.sdmmc.prepare_datapath_read( |
| 105 | .sdmmc | 106 | aligned_mut(buffer), |
| 106 | .prepare_datapath_read(buffer, block_size(size_of::<DataBlock>()), false); | 107 | DatapathMode::Block(block_size(size_of::<DataBlock>())), |
| 108 | ); | ||
| 107 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; | 109 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; |
| 108 | 110 | ||
| 109 | self.sdmmc.complete_datapath_transfer(transfer, false).await?; | 111 | self.sdmmc.complete_datapath_transfer(transfer, false).await?; |
| @@ -113,12 +115,10 @@ impl<'a, 'b> SerialDataInterface<'a, 'b> { | |||
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | /// Read in multibyte mode using cmd53 | 117 | /// Read in multibyte mode using cmd53 |
| 116 | pub async fn cmd53_byte_read(&mut self, arg: u32, buffer: &mut [u32]) -> Result<(), Error> { | 118 | pub async fn cmd53_byte_read(&mut self, arg: u32, buffer: &mut Aligned<A4, [u8]>) -> Result<(), Error> { |
| 117 | let _scoped_block_stop = self.sdmmc.info.rcc.block_stop(); | 119 | let _scoped_block_stop = self.sdmmc.info.rcc.block_stop(); |
| 118 | 120 | ||
| 119 | let transfer = self | 121 | let transfer = self.sdmmc.prepare_datapath_read(buffer, DatapathMode::Byte); |
| 120 | .sdmmc | ||
| 121 | .prepare_datapath_read(buffer, block_size(size_of::<DataBlock>()), true); | ||
| 122 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; | 122 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; |
| 123 | 123 | ||
| 124 | self.sdmmc.complete_datapath_transfer(transfer, false).await?; | 124 | self.sdmmc.complete_datapath_transfer(transfer, false).await?; |
| @@ -142,9 +142,10 @@ impl<'a, 'b> SerialDataInterface<'a, 'b> { | |||
| 142 | #[cfg(sdmmc_v1)] | 142 | #[cfg(sdmmc_v1)] |
| 143 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; | 143 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; |
| 144 | 144 | ||
| 145 | let transfer = self | 145 | let transfer = self.sdmmc.prepare_datapath_write( |
| 146 | .sdmmc | 146 | aligned_ref(buffer), |
| 147 | .prepare_datapath_read(buffer, block_size(size_of::<DataBlock>()), false); | 147 | DatapathMode::Block(block_size(size_of::<DataBlock>())), |
| 148 | ); | ||
| 148 | 149 | ||
| 149 | #[cfg(sdmmc_v2)] | 150 | #[cfg(sdmmc_v2)] |
| 150 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; | 151 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; |
| @@ -164,7 +165,7 @@ impl<'a, 'b> SerialDataInterface<'a, 'b> { | |||
| 164 | 165 | ||
| 165 | let transfer = self | 166 | let transfer = self |
| 166 | .sdmmc | 167 | .sdmmc |
| 167 | .prepare_datapath_write(buffer, block_size(size_of::<DataBlock>()), true); | 168 | .prepare_datapath_write(aligned_ref(buffer), DatapathMode::Byte); |
| 168 | 169 | ||
| 169 | #[cfg(sdmmc_v2)] | 170 | #[cfg(sdmmc_v2)] |
| 170 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; | 171 | self.sdmmc.cmd(cmd::<Rz>(53, arg), true)?; |
