diff options
| author | Scott Mabin <[email protected]> | 2024-08-26 19:45:57 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-26 20:45:57 +0200 |
| commit | f0a86070512ad739641cee7d9fa39d63f5c8a9f6 (patch) | |
| tree | bba80a5b83b414a75f69fc2cb3e8fd0581d68297 /embassy-stm32/src/sdmmc | |
| parent | 9347571fea243719826ff21b250bc0dff7f51fa5 (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.rs | 41 |
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 | |||
| 1515 | impl<'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 | } | ||
