aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/sdmmc
diff options
context:
space:
mode:
authorScott Mabin <[email protected]>2024-08-26 19:45:57 +0100
committerGitHub <[email protected]>2024-08-26 20:45:57 +0200
commitf0a86070512ad739641cee7d9fa39d63f5c8a9f6 (patch)
treebba80a5b83b414a75f69fc2cb3e8fd0581d68297 /embassy-stm32/src/sdmmc
parent9347571fea243719826ff21b250bc0dff7f51fa5 (diff)
Add block-device-driver impl for use with embedded-fatfs (#2607)
Diffstat (limited to 'embassy-stm32/src/sdmmc')
-rw-r--r--embassy-stm32/src/sdmmc/mod.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/embassy-stm32/src/sdmmc/mod.rs b/embassy-stm32/src/sdmmc/mod.rs
index 44ff9fcd5..ed344c412 100644
--- a/embassy-stm32/src/sdmmc/mod.rs
+++ b/embassy-stm32/src/sdmmc/mod.rs
@@ -1511,3 +1511,44 @@ foreach_peripheral!(
1511 } 1511 }
1512 }; 1512 };
1513); 1513);
1514
1515impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> block_device_driver::BlockDevice<512> for Sdmmc<'d, T, Dma> {
1516 type Error = Error;
1517 type Align = aligned::A4;
1518
1519 async fn read(
1520 &mut self,
1521 mut block_address: u32,
1522 buf: &mut [aligned::Aligned<Self::Align, [u8; 512]>],
1523 ) -> Result<(), Self::Error> {
1524 // FIXME/TODO because of missing read_blocks multiple we have to do this one block at a time
1525 for block in buf.iter_mut() {
1526 // safety aligned by block device
1527 let block = unsafe { &mut *(block as *mut _ as *mut crate::sdmmc::DataBlock) };
1528 self.read_block(block_address, block).await?;
1529 block_address += 1;
1530 }
1531
1532 Ok(())
1533 }
1534
1535 async fn write(
1536 &mut self,
1537 mut block_address: u32,
1538 buf: &[aligned::Aligned<Self::Align, [u8; 512]>],
1539 ) -> Result<(), Self::Error> {
1540 // FIXME/TODO because of missing read_blocks multiple we have to do this one block at a time
1541 for block in buf.iter() {
1542 // safety aligned by block device
1543 let block = unsafe { &*(block as *const _ as *const crate::sdmmc::DataBlock) };
1544 self.write_block(block_address, block).await?;
1545 block_address += 1;
1546 }
1547
1548 Ok(())
1549 }
1550
1551 async fn size(&mut self) -> Result<u64, Self::Error> {
1552 Ok(self.card()?.size())
1553 }
1554}