aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/sdmmc/sdio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/sdmmc/sdio.rs')
-rw-r--r--embassy-stm32/src/sdmmc/sdio.rs27
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 @@
1use core::ops::{Deref, DerefMut}; 1use core::ops::{Deref, DerefMut};
2 2
3use aligned::{A4, Aligned};
3use sdio_host::common_cmd::{R1, Rz, cmd}; 4use sdio_host::common_cmd::{R1, Rz, cmd};
4use sdio_host::sd::BusWidth; 5use sdio_host::sd::BusWidth;
5use sdio_host::sd_cmd; 6use sdio_host::sd_cmd;
6 7
7use crate::sdmmc::{Error, Sdmmc, block_size, slice8_mut, slice8_ref}; 8use crate::sdmmc::{DatapathMode, Error, Sdmmc, aligned_mut, aligned_ref, block_size, slice8_mut, slice8_ref};
8use crate::time::Hertz; 9use 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
40pub struct SerialDataInterface<'a, 'b> { 41pub 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)?;