A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd

SD: Move sd_parse_csd() into common sdmmc code

This leaves firmware/driver/sd.c only containing storage API wrappers

Change-Id: I94f3f38c180f3802f479cdc54723fcd1b7782421

+54 -55
+1 -1
apps/debug_menu.c
··· 1347 simplelist_addline( 1348 "Nsac: %d clk", card->nsac); 1349 simplelist_addline( 1350 - "R2W: *%d", card->r2w_factor); 1351 #if (CONFIG_STORAGE & STORAGE_SD) 1352 int csd_structure = card_extract_bits(card->csd, 127, 2); 1353 const char *ver;
··· 1347 simplelist_addline( 1348 "Nsac: %d clk", card->nsac); 1349 simplelist_addline( 1350 + "R2W: *%d", 1 << card->r2w_factor); 1351 #if (CONFIG_STORAGE & STORAGE_SD) 1352 int csd_structure = card_extract_bits(card->csd, 127, 2); 1353 const char *ver;
-52
firmware/drivers/sd.c
··· 20 ****************************************************************************/ 21 22 #include "config.h" 23 - #include "logf.h" 24 #include "sdmmc.h" 25 #include "storage.h" 26 - 27 - static const unsigned char sd_mantissa[] = { /* *10 */ 28 - 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 }; 29 - static const unsigned int sd_exponent[] = { /* use varies */ 30 - 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 }; 31 - 32 - void sd_parse_csd(tCardInfo *card) 33 - { 34 - unsigned int c_size, c_mult; 35 - const int csd_version = card_extract_bits(card->csd, 127, 2); 36 - if(csd_version == 0) 37 - { 38 - /* CSD version 1.0 */ 39 - int max_read_bl_len; 40 - 41 - c_size = card_extract_bits(card->csd, 73, 12) + 1; 42 - c_mult = 4 << card_extract_bits(card->csd, 49, 3); 43 - max_read_bl_len = 1 << card_extract_bits(card->csd, 83, 4); 44 - card->numblocks = c_size * c_mult * (max_read_bl_len/512); 45 - } 46 - else if(csd_version == 1) 47 - { 48 - /* CSD version 2.0 */ 49 - c_size = card_extract_bits(card->csd, 69, 22) + 1; 50 - card->numblocks = c_size << 10; 51 - } 52 - else if(csd_version == 2) 53 - { 54 - /* CSD version 3.0 */ 55 - c_size = card_extract_bits(card->csd, 75, 28) + 1; 56 - card->numblocks = c_size << 10; 57 - } 58 - card->sd2plus = csd_version >= 1; 59 - 60 - card->blocksize = 512; /* Always use 512 byte blocks */ 61 - 62 - card->speed = sd_mantissa[card_extract_bits(card->csd, 102, 4)] * 63 - sd_exponent[card_extract_bits(card->csd, 98, 3) + 4]; 64 - 65 - card->nsac = 100 * card_extract_bits(card->csd, 111, 8); 66 - 67 - card->taac = sd_mantissa[card_extract_bits(card->csd, 118, 4)] * 68 - sd_exponent[card_extract_bits(card->csd, 114, 3)]; 69 - 70 - card->r2w_factor = card_extract_bits(card->csd, 28, 3); 71 - 72 - 73 - 74 - logf("CSD%d.0 numblocks:%lld speed:%ld", csd_version+1, card->numblocks, card->speed); 75 - logf("nsac: %d taac: %ld r2w: %d", card->nsac, card->taac, card->r2w_factor); 76 - } 77 78 void sd_sleep(void) 79 {
··· 20 ****************************************************************************/ 21 22 #include "config.h" 23 #include "sdmmc.h" 24 #include "storage.h" 25 26 void sd_sleep(void) 27 {
+53 -2
firmware/sdmmc.c
··· 19 * 20 ****************************************************************************/ 21 #include "config.h" 22 #include "sdmmc.h" 23 24 /* helper function to extract n (<=32) bits from an arbitrary position. 25 counting from MSB to LSB */ 26 unsigned long card_extract_bits( ··· 36 37 long_index = start / 32; 38 bit_index = start % 32; 39 - 40 result = p[long_index] << bit_index; 41 42 if (bit_index + size > 32) /* crossing longword boundary */ 43 result |= p[long_index+1] >> (32 - bit_index); 44 - 45 result >>= 32 - size; 46 47 return result;
··· 19 * 20 ****************************************************************************/ 21 #include "config.h" 22 + #include "logf.h" 23 #include "sdmmc.h" 24 25 + static const unsigned char sd_mantissa[] = { /* *10 */ 26 + 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 }; 27 + static const unsigned int sd_exponent[] = { /* use varies, div10 */ 28 + 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 }; 29 + 30 + void sd_parse_csd(tCardInfo *card) 31 + { 32 + unsigned int c_size, c_mult; 33 + const int csd_version = card_extract_bits(card->csd, 127, 2); 34 + if(csd_version == 0) 35 + { 36 + /* CSD version 1.0 */ 37 + int max_read_bl_len; 38 + 39 + c_size = card_extract_bits(card->csd, 73, 12) + 1; 40 + c_mult = 4 << card_extract_bits(card->csd, 49, 3); 41 + max_read_bl_len = 1 << card_extract_bits(card->csd, 83, 4); 42 + card->numblocks = c_size * c_mult * (max_read_bl_len/512); 43 + } 44 + else if(csd_version == 1) 45 + { 46 + /* CSD version 2.0 */ 47 + c_size = card_extract_bits(card->csd, 69, 22) + 1; 48 + card->numblocks = c_size << 10; 49 + } 50 + else if(csd_version == 2) 51 + { 52 + /* CSD version 3.0 */ 53 + c_size = card_extract_bits(card->csd, 75, 28) + 1; 54 + card->numblocks = c_size << 10; 55 + } 56 + card->sd2plus = csd_version >= 1; 57 + 58 + card->blocksize = 512; /* Always use 512 byte blocks */ 59 + 60 + card->speed = sd_mantissa[card_extract_bits(card->csd, 102, 4)] * 61 + sd_exponent[card_extract_bits(card->csd, 98, 3) + 4]; 62 + 63 + card->nsac = 100 * card_extract_bits(card->csd, 111, 8); 64 + 65 + card->taac = sd_mantissa[card_extract_bits(card->csd, 118, 4)] * 66 + sd_exponent[card_extract_bits(card->csd, 114, 3)]; 67 + 68 + card->r2w_factor = card_extract_bits(card->csd, 28, 3); 69 + 70 + logf("CSD%d.0 numblocks:%lld speed:%ld", csd_version+1, card->numblocks, card->speed); 71 + logf("nsac: %d taac: %ld r2w: %d", card->nsac, card->taac, card->r2w_factor); 72 + } 73 + 74 + 75 /* helper function to extract n (<=32) bits from an arbitrary position. 76 counting from MSB to LSB */ 77 unsigned long card_extract_bits( ··· 87 88 long_index = start / 32; 89 bit_index = start % 32; 90 + 91 result = p[long_index] << bit_index; 92 93 if (bit_index + size > 32) /* crossing longword boundary */ 94 result |= p[long_index+1] >> (32 - bit_index); 95 + 96 result >>= 32 - size; 97 98 return result;