From 739805357fcea1c852238b475f87824d3015c3d0 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Tue, 16 Jun 2026 22:57:49 +0300 Subject: [PATCH] sdmmc: add sd vendor/rsvd info --- bdk/storage/sdmmc.c | 44 +++++++++++++++++++++++++++++++++++++++ bdk/storage/sdmmc.h | 50 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/bdk/storage/sdmmc.c b/bdk/storage/sdmmc.c index 85ab3d6b..bf345b54 100644 --- a/bdk/storage/sdmmc.c +++ b/bdk/storage/sdmmc.c @@ -968,6 +968,50 @@ void _sd_storage_debug_print_ssr(const u8 *raw_ssr) } #endif +void sd_storage_get_vendor_info(sdmmc_storage_t *storage, sd_vendor_info_t *info) +{ + // CID Reserved. + info->cid_rsvd = storage->cid.rsvd; + + // CSD Reserved. + info->csd_rsvd8_9 = unstuff_bits((u32 *)storage->raw_csd, 8, 2); + info->csd_rsvd16_20 = unstuff_bits((u32 *)storage->raw_csd, 16, 5); + info->csd_rsvd29_30 = unstuff_bits((u32 *)storage->raw_csd, 29, 2); + info->csd_rsvd120_125 = unstuff_bits((u32 *)storage->raw_csd, 120, 6); + + // SCR Vendor and Reserved. + u32 scr[4]; + memcpy(&scr[2], storage->raw_scr, 8); + info->scr_vendor = storage->scr.vendor; + info->scr_rsvd = unstuff_bits(scr, 36, 2); + + // SSR Vendor and Reserved. + u32 raw_ssr0[4]; // 511:384. + u32 raw_ssr1[4]; // 383:256. + u32 raw_ssr2[4]; // 255:128. + u32 raw_ssr3[4]; // 127:0. + memcpy(raw_ssr0, &storage->raw_ssr[0], 16); + memcpy(raw_ssr1, &storage->raw_ssr[16], 16); + memcpy(raw_ssr2, &storage->raw_ssr[32], 16); + memcpy(raw_ssr3, &storage->raw_ssr[48], 16); + info->ssr_vendor0_31 = unstuff_bits(raw_ssr3, 0, 32); + info->ssr_vendor32_63 = unstuff_bits(raw_ssr3, 32, 32); + info->ssr_vendor64_95 = unstuff_bits(raw_ssr3, 64, 32); + info->ssr_vendor96_127 = unstuff_bits(raw_ssr3, 96, 32); + info->ssr_vendor128_159 = unstuff_bits(raw_ssr2, 128, 32); + info->ssr_vendor160_191 = unstuff_bits(raw_ssr2, 160, 32); + info->ssr_vendor192_223 = unstuff_bits(raw_ssr2, 192, 32); + info->ssr_vendor224_255 = unstuff_bits(raw_ssr2, 224, 32); + info->ssr_vendor256_287 = unstuff_bits(raw_ssr1, 256, 32); + info->ssr_vendor288_311 = unstuff_bits(raw_ssr1, 288, 24); + + info->ssr_rsvd314_327 = unstuff_bits(raw_ssr1, 314, 14); + info->ssr_rsvd340_345 = unstuff_bits(raw_ssr1, 340, 6); + info->ssr_rsvd378_383 = unstuff_bits(raw_ssr1, 378, 6); + info->ssr_rsvd424_427 = unstuff_bits(raw_ssr0, 424, 4); + info->ssr_rsvd496_501 = unstuff_bits(raw_ssr0, 496, 6); +} + int sd_storage_get_ext_reg(sdmmc_storage_t *storage, u8 fno, u8 page, u16 address, u32 len, void *buf) { if (!(storage->scr.cmds & BIT(2))) diff --git a/bdk/storage/sdmmc.h b/bdk/storage/sdmmc.h index dc86529a..1f2ff1ac 100644 --- a/bdk/storage/sdmmc.h +++ b/bdk/storage/sdmmc.h @@ -190,6 +190,46 @@ typedef struct _sd_ext_reg_t int valid; } sd_ext_reg_t; +typedef struct _sd_func_modes_t +{ + u16 access_mode; + u16 cmd_system; + u16 driver_strength; + u16 power_limit; +} sd_func_modes_t; + +typedef struct _sd_vendor_info_t +{ + // CID Reserved. + u8 cid_rsvd; // 4-bit. + + // CSD Reserved. + u8 csd_rsvd8_9; // 2-bit. + u8 csd_rsvd16_20; // 5-bit. + u8 csd_rsvd29_30; // 2-bit. + u8 csd_rsvd120_125; // 6-bit. + + u32 scr_vendor; + u8 scr_rsvd; // 2-bit. + + u32 ssr_vendor0_31; + u32 ssr_vendor32_63; + u32 ssr_vendor64_95; + u32 ssr_vendor96_127; + u32 ssr_vendor128_159; + u32 ssr_vendor160_191; + u32 ssr_vendor192_223; + u32 ssr_vendor224_255; + u32 ssr_vendor256_287; + u32 ssr_vendor288_311; // 24-bit. + + u16 ssr_rsvd314_327; // 14-bit. + u8 ssr_rsvd340_345; // 6-bit. + u8 ssr_rsvd378_383; // 6-bit. + u8 ssr_rsvd424_427; // 4-bit. + u8 ssr_rsvd496_501; // 6-bit. +} sd_vendor_info_t; + /*! SDMMC storage context. */ typedef struct _sdmmc_storage_t { @@ -216,14 +256,6 @@ typedef struct _sdmmc_storage_t sd_ext_reg_t ser; } sdmmc_storage_t; -typedef struct _sd_func_modes_t -{ - u16 access_mode; - u16 cmd_system; - u16 driver_strength; - u16 power_limit; -} sd_func_modes_t; - int sdmmc_storage_end(sdmmc_storage_t *storage); int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); @@ -249,4 +281,6 @@ void sd_storage_get_ext_regs(sdmmc_storage_t *storage, u8 *buf); int sd_storage_parse_perf_enhance(sdmmc_storage_t *storage, u8 fno, u8 page, u16 offset, u8 *buf); bool sd_storage_get_ddr200_support(sdmmc_storage_t *storage); +void sd_storage_get_vendor_info(sdmmc_storage_t *storage, sd_vendor_info_t *info); + #endif