Revert "Use byte slices for sdmmc"

This reverts commit 8e79b096c1.
This commit is contained in:
chemicstry
2023-02-27 01:18:26 +02:00
parent 9be45c3be9
commit 5ea3419c82

View File

@ -39,6 +39,9 @@ impl Default for Signalling {
} }
} }
#[repr(align(4))]
pub struct DataBlock([u8; 512]);
/// Errors /// Errors
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
@ -55,10 +58,6 @@ pub enum Error {
BadClock, BadClock,
SignalingSwitchFailed, SignalingSwitchFailed,
PeripheralBusy, PeripheralBusy,
/// Buffers must be aligned to 4 bytes
UnalignedBuffer,
/// Buffer capacity did not match block size
UnsupportedBufferSize,
} }
/// A SD command /// A SD command
@ -472,22 +471,17 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> {
} }
#[inline(always)] #[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 card_capacity = self.card()?.card_type;
let inner = T::inner(); let inner = T::inner();
let state = T::state(); let state = T::state();
let (prefix, aligned, suffix) = unsafe { buffer.align_to_mut::<u32>() }; // NOTE(unsafe) DataBlock uses align 4
if !prefix.is_empty() || !suffix.is_empty() { let buf = unsafe { &mut *((&mut buffer.0) as *mut [u8; 512] as *mut [u32; 128]) };
return Err(Error::UnalignedBuffer);
}
let block: &mut [u32; 128] = aligned.try_into().map_err(|_| Error::UnsupportedBufferSize)?;
inner inner
.read_block( .read_block(
block_idx, block_idx,
block, buf,
card_capacity, card_capacity,
state, state,
self.config.data_transfer_timeout, self.config.data_transfer_timeout,
@ -496,22 +490,17 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> {
.await .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 card = self.card.as_mut().ok_or(Error::NoCard)?;
let inner = T::inner(); let inner = T::inner();
let state = T::state(); let state = T::state();
let (prefix, aligned, suffix) = unsafe { buffer.align_to::<u32>() }; // NOTE(unsafe) DataBlock uses align 4
if !prefix.is_empty() || !suffix.is_empty() { let buf = unsafe { &*((&buffer.0) as *const [u8; 512] as *const [u32; 128]) };
return Err(Error::UnalignedBuffer);
}
let block: &[u32; 128] = aligned.try_into().map_err(|_| Error::UnsupportedBufferSize)?;
inner inner
.write_block( .write_block(
block_idx, block_idx,
block, buf,
card, card,
state, state,
self.config.data_transfer_timeout, self.config.data_transfer_timeout,