From 97ebba1fbdeaebd589e60f71eaac5aeca0045357 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Fri, 22 Aug 2025 14:48:28 -0400 Subject: [PATCH] SD: Move sd_parse_csd() into common sdmmc code This leaves firmware/driver/sd.c only containing storage API wrappers Change-Id: I94f3f38c180f3802f479cdc54723fcd1b7782421 --- apps/debug_menu.c | 2 +- firmware/drivers/sd.c | 52 ---------------------------------------- firmware/sdmmc.c | 55 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 55 deletions(-) diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 2714d53e59..e6446f35d5 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -1347,7 +1347,7 @@ static int disk_callback(int btn, struct gui_synclist *lists) simplelist_addline( "Nsac: %d clk", card->nsac); simplelist_addline( - "R2W: *%d", card->r2w_factor); + "R2W: *%d", 1 << card->r2w_factor); #if (CONFIG_STORAGE & STORAGE_SD) int csd_structure = card_extract_bits(card->csd, 127, 2); const char *ver; diff --git a/firmware/drivers/sd.c b/firmware/drivers/sd.c index ca83498087..521bdfbdd0 100644 --- a/firmware/drivers/sd.c +++ b/firmware/drivers/sd.c @@ -20,61 +20,9 @@ ****************************************************************************/ #include "config.h" -#include "logf.h" #include "sdmmc.h" #include "storage.h" -static const unsigned char sd_mantissa[] = { /* *10 */ - 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 }; -static const unsigned int sd_exponent[] = { /* use varies */ - 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 }; - -void sd_parse_csd(tCardInfo *card) -{ - unsigned int c_size, c_mult; - const int csd_version = card_extract_bits(card->csd, 127, 2); - if(csd_version == 0) - { - /* CSD version 1.0 */ - int max_read_bl_len; - - c_size = card_extract_bits(card->csd, 73, 12) + 1; - c_mult = 4 << card_extract_bits(card->csd, 49, 3); - max_read_bl_len = 1 << card_extract_bits(card->csd, 83, 4); - card->numblocks = c_size * c_mult * (max_read_bl_len/512); - } - else if(csd_version == 1) - { - /* CSD version 2.0 */ - c_size = card_extract_bits(card->csd, 69, 22) + 1; - card->numblocks = c_size << 10; - } - else if(csd_version == 2) - { - /* CSD version 3.0 */ - c_size = card_extract_bits(card->csd, 75, 28) + 1; - card->numblocks = c_size << 10; - } - card->sd2plus = csd_version >= 1; - - card->blocksize = 512; /* Always use 512 byte blocks */ - - card->speed = sd_mantissa[card_extract_bits(card->csd, 102, 4)] * - sd_exponent[card_extract_bits(card->csd, 98, 3) + 4]; - - card->nsac = 100 * card_extract_bits(card->csd, 111, 8); - - card->taac = sd_mantissa[card_extract_bits(card->csd, 118, 4)] * - sd_exponent[card_extract_bits(card->csd, 114, 3)]; - - card->r2w_factor = card_extract_bits(card->csd, 28, 3); - - - - logf("CSD%d.0 numblocks:%lld speed:%ld", csd_version+1, card->numblocks, card->speed); - logf("nsac: %d taac: %ld r2w: %d", card->nsac, card->taac, card->r2w_factor); -} - void sd_sleep(void) { } diff --git a/firmware/sdmmc.c b/firmware/sdmmc.c index bb3820f930..3f9e2d4e3c 100644 --- a/firmware/sdmmc.c +++ b/firmware/sdmmc.c @@ -19,8 +19,59 @@ * ****************************************************************************/ #include "config.h" +#include "logf.h" #include "sdmmc.h" +static const unsigned char sd_mantissa[] = { /* *10 */ + 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 }; +static const unsigned int sd_exponent[] = { /* use varies, div10 */ + 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 }; + +void sd_parse_csd(tCardInfo *card) +{ + unsigned int c_size, c_mult; + const int csd_version = card_extract_bits(card->csd, 127, 2); + if(csd_version == 0) + { + /* CSD version 1.0 */ + int max_read_bl_len; + + c_size = card_extract_bits(card->csd, 73, 12) + 1; + c_mult = 4 << card_extract_bits(card->csd, 49, 3); + max_read_bl_len = 1 << card_extract_bits(card->csd, 83, 4); + card->numblocks = c_size * c_mult * (max_read_bl_len/512); + } + else if(csd_version == 1) + { + /* CSD version 2.0 */ + c_size = card_extract_bits(card->csd, 69, 22) + 1; + card->numblocks = c_size << 10; + } + else if(csd_version == 2) + { + /* CSD version 3.0 */ + c_size = card_extract_bits(card->csd, 75, 28) + 1; + card->numblocks = c_size << 10; + } + card->sd2plus = csd_version >= 1; + + card->blocksize = 512; /* Always use 512 byte blocks */ + + card->speed = sd_mantissa[card_extract_bits(card->csd, 102, 4)] * + sd_exponent[card_extract_bits(card->csd, 98, 3) + 4]; + + card->nsac = 100 * card_extract_bits(card->csd, 111, 8); + + card->taac = sd_mantissa[card_extract_bits(card->csd, 118, 4)] * + sd_exponent[card_extract_bits(card->csd, 114, 3)]; + + card->r2w_factor = card_extract_bits(card->csd, 28, 3); + + logf("CSD%d.0 numblocks:%lld speed:%ld", csd_version+1, card->numblocks, card->speed); + logf("nsac: %d taac: %ld r2w: %d", card->nsac, card->taac, card->r2w_factor); +} + + /* helper function to extract n (<=32) bits from an arbitrary position. counting from MSB to LSB */ unsigned long card_extract_bits( @@ -36,12 +87,12 @@ unsigned long card_extract_bits( long_index = start / 32; bit_index = start % 32; - + result = p[long_index] << bit_index; if (bit_index + size > 32) /* crossing longword boundary */ result |= p[long_index+1] >> (32 - bit_index); - + result >>= 32 - size; return result;