#[derive(Debug, Clone, Copy, Default)]
pub struct SdCardInfo {
pub rca: u32,
pub csd_raw: [u32; 4],
pub csd_structure: u8,
pub capacity_bytes: u64,
}
pub fn parse_sd_card_info(rca: u32, csd_raw: [u32; 4]) -> SdCardInfo {
let r0 = csd_raw[0];
let r1 = csd_raw[1];
let r2 = csd_raw[2];
let r3 = csd_raw[3];
let csd_structure = ((r3 >> 22) & 0x3) as u8;
let capacity_bytes = match csd_structure {
0 => {
let read_bl_len = (r2 >> 8) & 0xF;
let c_size = ((r2 & 0x3) << 10) | ((r1 >> 22) & 0x3FF);
let c_size_mult = (r1 >> 7) & 0x7;
let mult = 1u64 << (c_size_mult + 2);
let blocknr = (c_size as u64 + 1) * mult;
let block_len = 1u64 << read_bl_len;
blocknr * block_len
}
1 => {
let c_size = (r1 >> 8) & 0x3F_FFFF;
(c_size as u64 + 1) * 512 * 1024
}
2 => {
let c_size = ((r2 & 0xF) << 24) | ((r1 >> 8) & 0xFF_FFFF);
(c_size as u64 + 1) * 512 * 1024
}
_ => 0,
};
let _ = r0;
SdCardInfo {
rca,
csd_raw,
csd_structure,
capacity_bytes,
}
}