Iterate through volume labels

This commit is contained in:
Frederik Menke 2024-07-06 17:05:12 +02:00
parent 31e5b10ce5
commit f2bf073676
2 changed files with 27 additions and 14 deletions

View file

@ -1,2 +1,6 @@
build: build:
cargo build cargo build
rerun:
probe-rs reset --chip RP2040
probe-rs attach --chip RP2040 target/thumbv6m-none-eabi/debug/co2_sensing

View file

@ -13,9 +13,8 @@ use embassy_executor::Spawner;
use embassy_rp::spi::Spi; use embassy_rp::spi::Spi;
use embassy_rp::{gpio, spi}; use embassy_rp::{gpio, spi};
use embedded_hal_bus::spi::ExclusiveDevice; use embedded_hal_bus::spi::ExclusiveDevice;
use embedded_sdmmc::fat::Bpb;
use embedded_sdmmc::sdcard::{DummyCsPin, SdCard}; use embedded_sdmmc::sdcard::{DummyCsPin, SdCard};
use embedded_sdmmc::{Block, BlockCount, BlockDevice, BlockIdx, FatVolume, VolumeIdx, VolumeType}; use embedded_sdmmc::{Block, BlockDevice, BlockIdx, VolumeIdx};
use gpio::{Level, Output}; use gpio::{Level, Output};
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
@ -61,8 +60,13 @@ async fn main(_spawner: Spawner) {
let mut volume_mgr = embedded_sdmmc::VolumeManager::new(sdcard, DummyTimesource()); let mut volume_mgr = embedded_sdmmc::VolumeManager::new(sdcard, DummyTimesource());
{ {
let device = volume_mgr.device(); let device = volume_mgr.device();
let info = read_volume_label(device, VolumeIdx(0)).unwrap(); for (index, label) in valid_volumes(device).into_iter().flatten() {
info!("Volume 0: name: {:?}", core::str::from_utf8(&info).unwrap()); info!(
"Volume {}: name: {:?}",
index.0,
core::str::from_utf8(&label).unwrap()
);
}
} }
// Try and access Volume 0 (i.e. the first partition). // Try and access Volume 0 (i.e. the first partition).
@ -102,6 +106,19 @@ async fn main(_spawner: Spawner) {
info!("Program end") info!("Program end")
} }
pub fn valid_volumes<D>(block_device: &mut D) -> [Option<(VolumeIdx, [u8; 11])>; 4]
where
D: BlockDevice,
{
let mut res = [None; 4];
for i in 0..4 {
let index_and_label = read_volume_label(block_device, VolumeIdx(i))
.ok()
.map(|label| (VolumeIdx(i), label));
res[i] = index_and_label;
}
res
}
/// Read out the volume label a partition /// Read out the volume label a partition
/// ///
/// I mostly pulled out some interiors of `embedded_sdmmc` and plugged /// I mostly pulled out some interiors of `embedded_sdmmc` and plugged
@ -125,7 +142,6 @@ where
const PARTITION_INFO_STATUS_INDEX: usize = 0; const PARTITION_INFO_STATUS_INDEX: usize = 0;
const PARTITION_INFO_TYPE_INDEX: usize = 4; const PARTITION_INFO_TYPE_INDEX: usize = 4;
const PARTITION_INFO_LBA_START_INDEX: usize = 8; const PARTITION_INFO_LBA_START_INDEX: usize = 8;
const PARTITION_INFO_NUM_BLOCKS_INDEX: usize = 12;
/// Marker for a FAT32 partition. Sometimes also use for FAT16 formatted /// Marker for a FAT32 partition. Sometimes also use for FAT16 formatted
/// partitions. /// partitions.
const PARTITION_ID_FAT32_LBA: u8 = 0x0C; const PARTITION_ID_FAT32_LBA: u8 = 0x0C;
@ -138,7 +154,7 @@ where
/// use. /// use.
const PARTITION_ID_FAT32_CHS_LBA: u8 = 0x0B; const PARTITION_ID_FAT32_CHS_LBA: u8 = 0x0B;
let (part_type, lba_start, num_blocks) = { let (part_type, lba_start) = {
let mut blocks = [Block::new()]; let mut blocks = [Block::new()];
block_device block_device
.read(&mut blocks, BlockIdx(0), "read_mbr") .read(&mut blocks, BlockIdx(0), "read_mbr")
@ -165,14 +181,7 @@ where
let lba_start = LittleEndian::read_u32( let lba_start = LittleEndian::read_u32(
&partition[PARTITION_INFO_LBA_START_INDEX..(PARTITION_INFO_LBA_START_INDEX + 4)], &partition[PARTITION_INFO_LBA_START_INDEX..(PARTITION_INFO_LBA_START_INDEX + 4)],
); );
let num_blocks = LittleEndian::read_u32( (partition[PARTITION_INFO_TYPE_INDEX], BlockIdx(lba_start))
&partition[PARTITION_INFO_NUM_BLOCKS_INDEX..(PARTITION_INFO_NUM_BLOCKS_INDEX + 4)],
);
(
partition[PARTITION_INFO_TYPE_INDEX],
BlockIdx(lba_start),
BlockCount(num_blocks),
)
}; };
match part_type { match part_type {
PARTITION_ID_FAT32_CHS_LBA PARTITION_ID_FAT32_CHS_LBA