[sd] Correct ssr parsing + add write protect info

This commit is contained in:
Kostas Missos 2018-05-15 20:17:56 +03:00 committed by nwert
parent 54187226c8
commit e06d833cf8
3 changed files with 44 additions and 27 deletions

View file

@ -574,9 +574,10 @@ void print_sdcard_info()
Speed Class: %d\n\ Speed Class: %d\n\
UHS Grade: U%d\n\ UHS Grade: U%d\n\
Video Class: V%d\n\ Video Class: V%d\n\
App perf class: A%d\n\n", App perf class: A%d\n\
sd_storage.ssr.bus_width, sd_storage.ssr.speed_class, sd_storage.ssr.uhs_grade, Write Protect: %d\n\n",
sd_storage.ssr.video_class, sd_storage.ssr.app_class); sd_storage.ssr.bus_width, sd_storage.ssr.speed_class, sd_storage.ssr.uhs_grade,
sd_storage.ssr.video_class, sd_storage.ssr.app_class, sd_storage.csd.write_protect);
gfx_puts(&gfx_con, "Acquiring FAT volume info...\n\n"); gfx_puts(&gfx_con, "Acquiring FAT volume info...\n\n");
f_getfree("", &sd_fs.free_clst, NULL); f_getfree("", &sd_fs.free_clst, NULL);

View file

@ -824,9 +824,22 @@ int _sd_storage_enable_highspeed_high_volt(sdmmc_storage_t *storage, u8 *buf)
static void _sd_storage_parse_ssr(sdmmc_storage_t *storage) static void _sd_storage_parse_ssr(sdmmc_storage_t *storage)
{ {
u32 *raw_ssr = (u32 *)&(storage->raw_ssr); // unstuff_bits supports only 4 u32 so break into 2 x 16byte groups
storage->ssr.bus_width = unstuff_bits(raw_ssr, 510 - 384, 2) & SD_BUS_WIDTH_4 ? 4 : 1; u32 raw_ssr1[4];
switch(unstuff_bits(raw_ssr, 440 - 384, 8)) u32 raw_ssr2[4];
raw_ssr1[3] = *(u32 *)&storage->raw_ssr[12];
raw_ssr1[2] = *(u32 *)&storage->raw_ssr[8];
raw_ssr1[1] = *(u32 *)&storage->raw_ssr[4];
raw_ssr1[0] = *(u32 *)&storage->raw_ssr[0];
raw_ssr2[3] = *(u32 *)&storage->raw_ssr[28];
raw_ssr2[2] = *(u32 *)&storage->raw_ssr[24];
raw_ssr2[1] = *(u32 *)&storage->raw_ssr[20];
raw_ssr2[0] = *(u32 *)&storage->raw_ssr[16];
storage->ssr.bus_width = unstuff_bits(raw_ssr1, 510 - 384, 2) & SD_BUS_WIDTH_4 ? 4 : 1;
switch(unstuff_bits(raw_ssr1, 440 - 384, 8))
{ {
case 0: case 0:
storage->ssr.speed_class = 0; storage->ssr.speed_class = 0;
@ -844,12 +857,13 @@ static void _sd_storage_parse_ssr(sdmmc_storage_t *storage)
storage->ssr.speed_class = 10; storage->ssr.speed_class = 10;
break; break;
default: default:
storage->ssr.speed_class = unstuff_bits(raw_ssr, 440 - 384, 8); storage->ssr.speed_class = unstuff_bits(raw_ssr1, 440 - 384, 8);
break; break;
} }
storage->ssr.uhs_grade = unstuff_bits(raw_ssr, 396 - 384, 4); storage->ssr.uhs_grade = unstuff_bits(raw_ssr1, 396 - 384, 4);
storage->ssr.video_class = unstuff_bits(raw_ssr, 384 - 384, 8); storage->ssr.video_class = unstuff_bits(raw_ssr1, 384 - 384, 8);
storage->ssr.app_class = unstuff_bits(raw_ssr + 16, 472 + 4 - 384, 4);
storage->ssr.app_class = unstuff_bits(raw_ssr2, 336 - 256, 4);
} }
static int _sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf) static int _sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf)
@ -894,17 +908,17 @@ static void _sd_storage_parse_cid(sdmmc_storage_t *storage)
u32 *raw_cid = (u32 *)&(storage->raw_cid); u32 *raw_cid = (u32 *)&(storage->raw_cid);
storage->cid.manfid = unstuff_bits(raw_cid, 120, 8); storage->cid.manfid = unstuff_bits(raw_cid, 120, 8);
storage->cid.oemid = unstuff_bits(raw_cid, 104, 16); storage->cid.oemid = unstuff_bits(raw_cid, 104, 16);
storage->cid.prod_name[0] = unstuff_bits(raw_cid, 96, 8); storage->cid.prod_name[0] = unstuff_bits(raw_cid, 96, 8);
storage->cid.prod_name[1] = unstuff_bits(raw_cid, 88, 8); storage->cid.prod_name[1] = unstuff_bits(raw_cid, 88, 8);
storage->cid.prod_name[2] = unstuff_bits(raw_cid, 80, 8); storage->cid.prod_name[2] = unstuff_bits(raw_cid, 80, 8);
storage->cid.prod_name[3] = unstuff_bits(raw_cid, 72, 8); storage->cid.prod_name[3] = unstuff_bits(raw_cid, 72, 8);
storage->cid.prod_name[4] = unstuff_bits(raw_cid, 64, 8); storage->cid.prod_name[4] = unstuff_bits(raw_cid, 64, 8);
storage->cid.hwrev = unstuff_bits(raw_cid, 60, 4); storage->cid.hwrev = unstuff_bits(raw_cid, 60, 4);
storage->cid.fwrev = unstuff_bits(raw_cid, 56, 4); storage->cid.fwrev = unstuff_bits(raw_cid, 56, 4);
storage->cid.serial = unstuff_bits(raw_cid, 24, 32); storage->cid.serial = unstuff_bits(raw_cid, 24, 32);
storage->cid.month = unstuff_bits(raw_cid, 8, 4); storage->cid.month = unstuff_bits(raw_cid, 8, 4);
storage->cid.year = unstuff_bits(raw_cid, 12, 8) + 2000; storage->cid.year = unstuff_bits(raw_cid, 12, 8) + 2000;
} }
static void _sd_storage_parse_csd(sdmmc_storage_t *storage) static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
@ -912,8 +926,9 @@ static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
u32 *raw_csd = (u32 *)&(storage->raw_csd); u32 *raw_csd = (u32 *)&(storage->raw_csd);
storage->csd.structure = unstuff_bits(raw_csd, 126, 2); storage->csd.structure = unstuff_bits(raw_csd, 126, 2);
storage->csd.cmdclass = unstuff_bits(raw_csd, 84, 12); storage->csd.cmdclass = unstuff_bits(raw_csd, 84, 12);
storage->csd.read_blkbits = unstuff_bits(raw_csd, 80, 4); storage->csd.read_blkbits = unstuff_bits(raw_csd, 80, 4);
storage->csd.write_protect = unstuff_bits(raw_csd, 12, 2);
switch(storage->csd.structure) switch(storage->csd.structure)
{ {
case 0: case 0:

View file

@ -36,16 +36,17 @@ typedef struct _mmc_cid
typedef struct _mmc_csd typedef struct _mmc_csd
{ {
u8 structure; u8 structure;
u8 mmca_vsn; u8 mmca_vsn;
u16 cmdclass; u16 cmdclass;
u32 c_size; u32 c_size;
u32 r2w_factor; u32 r2w_factor;
u32 max_dtr; u32 max_dtr;
u32 erase_size; /* In sectors */ u32 erase_size; /* In sectors */
u32 read_blkbits; u32 read_blkbits;
u32 write_blkbits; u32 write_blkbits;
u32 capacity; u32 capacity;
u8 write_protect;
} mmc_csd_t; } mmc_csd_t;
typedef struct _mmc_ext_csd typedef struct _mmc_ext_csd