From 5ea3419c825420ba88a9ac6d1ef21269e44f8b81 Mon Sep 17 00:00:00 2001 From: chemicstry Date: Mon, 27 Feb 2023 01:18:26 +0200 Subject: [PATCH] Revert "Use byte slices for sdmmc" This reverts commit 8e79b096c1044abd40e59cc85f2388f92330baa0. --- embassy-stm32/src/sdmmc/mod.rs | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/embassy-stm32/src/sdmmc/mod.rs b/embassy-stm32/src/sdmmc/mod.rs index c550ee76..784b16e6 100644 --- a/embassy-stm32/src/sdmmc/mod.rs +++ b/embassy-stm32/src/sdmmc/mod.rs @@ -39,6 +39,9 @@ impl Default for Signalling { } } +#[repr(align(4))] +pub struct DataBlock([u8; 512]); + /// Errors #[non_exhaustive] #[derive(Debug, Copy, Clone)] @@ -55,10 +58,6 @@ pub enum Error { BadClock, SignalingSwitchFailed, PeripheralBusy, - /// Buffers must be aligned to 4 bytes - UnalignedBuffer, - /// Buffer capacity did not match block size - UnsupportedBufferSize, } /// A SD command @@ -472,22 +471,17 @@ impl<'d, T: Instance, Dma: SdmmcDma> Sdmmc<'d, T, Dma> { } #[inline(always)] - pub async fn read_block(&mut self, block_idx: u32, buffer: &mut [u8]) -> Result<(), Error> { + pub async fn read_block(&mut self, block_idx: u32, buffer: &mut DataBlock) -> Result<(), Error> { let card_capacity = self.card()?.card_type; let inner = T::inner(); let state = T::state(); - let (prefix, aligned, suffix) = unsafe { buffer.align_to_mut::() }; - if !prefix.is_empty() || !suffix.is_empty() { - return Err(Error::UnalignedBuffer); - } - - let block: &mut [u32; 128] = aligned.try_into().map_err(|_| Error::UnsupportedBufferSize)?; - + // NOTE(unsafe) DataBlock uses align 4 + let buf = unsafe { &mut *((&mut buffer.0) as *mut [u8; 512] as *mut [u32; 128]) }; inner .read_block( block_idx, - block, + buf, card_capacity, state, self.config.data_transfer_timeout, @@ -496,22 +490,17 @@ impl<'d, T: Instance, Dma: SdmmcDma> Sdmmc<'d, T, Dma> { .await } - pub async fn write_block(&mut self, block_idx: u32, buffer: &[u8]) -> Result<(), Error> { + pub async fn write_block(&mut self, block_idx: u32, buffer: &DataBlock) -> Result<(), Error> { let card = self.card.as_mut().ok_or(Error::NoCard)?; let inner = T::inner(); let state = T::state(); - let (prefix, aligned, suffix) = unsafe { buffer.align_to::() }; - if !prefix.is_empty() || !suffix.is_empty() { - return Err(Error::UnalignedBuffer); - } - - let block: &[u32; 128] = aligned.try_into().map_err(|_| Error::UnsupportedBufferSize)?; - + // NOTE(unsafe) DataBlock uses align 4 + let buf = unsafe { &*((&buffer.0) as *const [u8; 512] as *const [u32; 128]) }; inner .write_block( block_idx, - block, + buf, card, state, self.config.data_transfer_timeout,