From c5c7a2143b15530b0c8f08d1dd6e24a6985318f9 Mon Sep 17 00:00:00 2001 From: xoviat Date: Tue, 9 Dec 2025 19:36:05 -0600 Subject: sdmmc: refactor sd card creation --- examples/stm32f4/src/bin/sdmmc.rs | 35 ++++++++++++++--------------------- examples/stm32f7/src/bin/sdmmc.rs | 12 ++++++++---- examples/stm32h7/src/bin/sdmmc.rs | 14 ++++++++------ 3 files changed, 30 insertions(+), 31 deletions(-) (limited to 'examples') diff --git a/examples/stm32f4/src/bin/sdmmc.rs b/examples/stm32f4/src/bin/sdmmc.rs index fe0f887bf..897b0e05e 100644 --- a/examples/stm32f4/src/bin/sdmmc.rs +++ b/examples/stm32f4/src/bin/sdmmc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_stm32::sdmmc::{DataBlock, Sdmmc}; +use embassy_stm32::sdmmc::{CmdBlock, DataBlock, Sdmmc, StorageDevice}; use embassy_stm32::time::{Hertz, mhz}; use embassy_stm32::{Config, bind_interrupts, peripherals, sdmmc}; use {defmt_rtt as _, panic_probe as _}; @@ -57,23 +57,16 @@ async fn main(_spawner: Spawner) { // Should print 400kHz for initialization info!("Configured clock: {}", sdmmc.clock().0); - let mut err = None; - loop { - match sdmmc.init_sd_card(mhz(24)).await { - Ok(_) => break, - Err(e) => { - if err != Some(e) { - info!("waiting for card error, retrying: {:?}", e); - err = Some(e); - } - } - } - } + let mut cmd_block = CmdBlock::new(); + + let mut storage = StorageDevice::new_sd_card(&mut sdmmc, &mut cmd_block, mhz(24)) + .await + .unwrap(); - let card = unwrap!(sdmmc.card()); + let card = storage.card(); - info!("Card: {:#?}", Debug2Format(card)); - info!("Clock: {}", sdmmc.clock()); + info!("Card: {:#?}", Debug2Format(&card)); + info!("Clock: {}", storage.sdmmc.clock()); // Arbitrary block index let block_idx = 16; @@ -81,7 +74,7 @@ async fn main(_spawner: Spawner) { // SDMMC uses `DataBlock` instead of `&[u8]` to ensure 4 byte alignment required by the hardware. let mut block = DataBlock([0u8; 512]); - sdmmc.read_block(block_idx, &mut block).await.unwrap(); + storage.read_block(block_idx, &mut block).await.unwrap(); info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]); if !ALLOW_WRITES { @@ -91,17 +84,17 @@ async fn main(_spawner: Spawner) { info!("Filling block with 0x55"); block.fill(0x55); - sdmmc.write_block(block_idx, &block).await.unwrap(); + storage.write_block(block_idx, &block).await.unwrap(); info!("Write done"); - sdmmc.read_block(block_idx, &mut block).await.unwrap(); + storage.read_block(block_idx, &mut block).await.unwrap(); info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]); info!("Filling block with 0xAA"); block.fill(0xAA); - sdmmc.write_block(block_idx, &block).await.unwrap(); + storage.write_block(block_idx, &block).await.unwrap(); info!("Write done"); - sdmmc.read_block(block_idx, &mut block).await.unwrap(); + storage.read_block(block_idx, &mut block).await.unwrap(); info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]); } diff --git a/examples/stm32f7/src/bin/sdmmc.rs b/examples/stm32f7/src/bin/sdmmc.rs index 8809b5d0c..0dd4dd6f3 100644 --- a/examples/stm32f7/src/bin/sdmmc.rs +++ b/examples/stm32f7/src/bin/sdmmc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_stm32::sdmmc::Sdmmc; +use embassy_stm32::sdmmc::{CmdBlock, Sdmmc, StorageDevice}; use embassy_stm32::time::{Hertz, mhz}; use embassy_stm32::{Config, bind_interrupts, peripherals, sdmmc}; use {defmt_rtt as _, panic_probe as _}; @@ -54,9 +54,13 @@ async fn main(_spawner: Spawner) { // Should print 400kHz for initialization info!("Configured clock: {}", sdmmc.clock().0); - unwrap!(sdmmc.init_sd_card(mhz(25)).await); + let mut cmd_block = CmdBlock::new(); - let card = unwrap!(sdmmc.card()); + let storage = StorageDevice::new_sd_card(&mut sdmmc, &mut cmd_block, mhz(25)) + .await + .unwrap(); - info!("Card: {:#?}", Debug2Format(card)); + let card = storage.card(); + + info!("Card: {:#?}", Debug2Format(&card)); } diff --git a/examples/stm32h7/src/bin/sdmmc.rs b/examples/stm32h7/src/bin/sdmmc.rs index 4977fec79..548d0bd09 100644 --- a/examples/stm32h7/src/bin/sdmmc.rs +++ b/examples/stm32h7/src/bin/sdmmc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_stm32::sdmmc::Sdmmc; +use embassy_stm32::sdmmc::{CmdBlock, Sdmmc, StorageDevice}; use embassy_stm32::time::mhz; use embassy_stm32::{Config, bind_interrupts, peripherals, sdmmc}; use {defmt_rtt as _, panic_probe as _}; @@ -13,7 +13,7 @@ bind_interrupts!(struct Irqs { }); #[embassy_executor::main] -async fn main(_spawner: Spawner) -> ! { +async fn main(_spawner: Spawner) { let mut config = Config::default(); { use embassy_stm32::rcc::*; @@ -53,11 +53,13 @@ async fn main(_spawner: Spawner) -> ! { // Should print 400kHz for initialization info!("Configured clock: {}", sdmmc.clock().0); - unwrap!(sdmmc.init_sd_card(mhz(25)).await); + let mut cmd_block = CmdBlock::new(); - let card = unwrap!(sdmmc.card()); + let storage = StorageDevice::new_sd_card(&mut sdmmc, &mut cmd_block, mhz(25)) + .await + .unwrap(); - info!("Card: {:#?}", Debug2Format(card)); + let card = storage.card(); - loop {} + info!("Card: {:#?}", Debug2Format(&card)); } -- cgit