diff options
| -rw-r--r-- | embassy-stm32/Cargo.toml | 2 | ||||
| -rw-r--r-- | embassy-stm32/src/sdmmc/mod.rs | 41 |
2 files changed, 43 insertions, 0 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index 54abd0799..9a6a5908e 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml | |||
| @@ -88,6 +88,8 @@ static_assertions = { version = "1.1" } | |||
| 88 | volatile-register = { version = "0.2.1" } | 88 | volatile-register = { version = "0.2.1" } |
| 89 | bitflags = "2.4.2" | 89 | bitflags = "2.4.2" |
| 90 | 90 | ||
| 91 | block-device-driver = { version = "0.2" } | ||
| 92 | aligned = "0.4.1" | ||
| 91 | 93 | ||
| 92 | [dev-dependencies] | 94 | [dev-dependencies] |
| 93 | critical-section = { version = "1.1", features = ["std"] } | 95 | critical-section = { version = "1.1", features = ["std"] } |
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 | } | ||
