Use byte slices for sdmmc
This commit is contained in:
parent
0559de4d1f
commit
8e79b096c1
@ -39,9 +39,6 @@ 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)]
|
||||||
@ -58,6 +55,10 @@ 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
|
||||||
@ -471,17 +472,22 @@ 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 DataBlock) -> Result<(), Error> {
|
pub async fn read_block(&mut self, block_idx: u32, buffer: &mut [u8]) -> 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();
|
||||||
|
|
||||||
// NOTE(unsafe) DataBlock uses align 4
|
let (prefix, aligned, suffix) = unsafe { buffer.align_to_mut::<u32>() };
|
||||||
let buf = unsafe { &mut *((&mut buffer.0) as *mut [u8; 512] as *mut [u32; 128]) };
|
if !prefix.is_empty() || !suffix.is_empty() {
|
||||||
|
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,
|
||||||
buf,
|
block,
|
||||||
card_capacity,
|
card_capacity,
|
||||||
state,
|
state,
|
||||||
self.config.data_transfer_timeout,
|
self.config.data_transfer_timeout,
|
||||||
@ -490,17 +496,22 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn write_block(&mut self, block_idx: u32, buffer: &DataBlock) -> Result<(), Error> {
|
pub async fn write_block(&mut self, block_idx: u32, buffer: &[u8]) -> 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();
|
||||||
|
|
||||||
// NOTE(unsafe) DataBlock uses align 4
|
let (prefix, aligned, suffix) = unsafe { buffer.align_to::<u32>() };
|
||||||
let buf = unsafe { &*((&buffer.0) as *const [u8; 512] as *const [u32; 128]) };
|
if !prefix.is_empty() || !suffix.is_empty() {
|
||||||
|
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,
|
||||||
buf,
|
block,
|
||||||
card,
|
card,
|
||||||
state,
|
state,
|
||||||
self.config.data_transfer_timeout,
|
self.config.data_transfer_timeout,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user