From e08e6cc3b278a148fc90bf5d13506dfed5b06244 Mon Sep 17 00:00:00 2001 From: Frederik Menke Date: Sat, 6 Jul 2024 13:03:44 +0200 Subject: [PATCH] Only read out partition volume names --- src/main.rs | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7c0704a..27b1c7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use embassy_executor::Spawner; use embassy_rp::spi::Spi; use embassy_rp::{gpio, spi}; use embedded_hal_bus::spi::ExclusiveDevice; +use embedded_sdmmc::fat::Bpb; use embedded_sdmmc::sdcard::{DummyCsPin, SdCard}; use embedded_sdmmc::{Block, BlockCount, BlockDevice, BlockIdx, FatVolume, VolumeIdx, VolumeType}; use gpio::{Level, Output}; @@ -60,8 +61,8 @@ async fn main(_spawner: Spawner) { let mut volume_mgr = embedded_sdmmc::VolumeManager::new(sdcard, DummyTimesource()); { let device = volume_mgr.device(); - let info = read_volume_info(device, VolumeIdx(0)).unwrap(); - info!("Volume 0: name: {:?}", defmt::Debug2Format(&info)); + let info = read_volume_label(device, VolumeIdx(0)).unwrap(); + info!("Volume 0: name: {:?}", core::str::from_utf8(&info).unwrap()); } // Try and access Volume 0 (i.e. the first partition). @@ -90,6 +91,7 @@ async fn main(_spawner: Spawner) { } } { + // Append some text to the end of the file let mut my_file = root_dir .open_file_in_dir("MY_FILE.TXT", embedded_sdmmc::Mode::ReadWriteAppend) .unwrap(); @@ -100,10 +102,14 @@ async fn main(_spawner: Spawner) { info!("Program end") } -pub fn read_volume_info( +/// Read out the volume label a partition +/// +/// I mostly pulled out some interiors of `embedded_sdmmc` and plugged +/// them back together. +pub fn read_volume_label( block_device: &mut D, volume_idx: VolumeIdx, -) -> Result> +) -> Result<[u8; 11], embedded_sdmmc::Error> where D: BlockDevice, { @@ -173,9 +179,19 @@ where | PARTITION_ID_FAT32_LBA | PARTITION_ID_FAT16_LBA | PARTITION_ID_FAT16 => { - let volume = embedded_sdmmc::fat::parse_volume(block_device, lba_start, num_blocks)?; - let VolumeType::Fat(fat) = volume; - Ok(fat) + let label = { + let mut blocks = [Block::new()]; + block_device + .read(&mut blocks, lba_start, "read_bpb") + .map_err(Error::DeviceError)?; + let block = &blocks[0]; + let bpb = embedded_sdmmc::fat::Bpb::create_from_bytes(block) + .map_err(Error::FormatError)?; + let mut label = [0u8; 11]; + label.copy_from_slice(&bpb.volume_label()[0..11]); + label + }; + Ok(label) } _ => Err(Error::FormatError("Partition type not supported")), }