From b9a43e64d766787427875a848cfc85ab76226535 Mon Sep 17 00:00:00 2001 From: Mikey Sklar Date: Mon, 18 May 2026 11:54:28 -0700 Subject: [PATCH 1/2] sdcardio: fix card size for SDXC cards > 32 GB The CSD v2.0 C_SIZE field is 22 bits but only the bottom 16 were being read. Cards > 32 GB reported roughly half their actual block count over USB MSC. Fix reads all 22 bits. Co-Authored-By: Claude Sonnet 4.6 --- shared-module/sdcardio/SDCard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/sdcardio/SDCard.c b/shared-module/sdcardio/SDCard.c index 3630e4ea16743..cadd2ba8a094a 100644 --- a/shared-module/sdcardio/SDCard.c +++ b/shared-module/sdcardio/SDCard.c @@ -316,7 +316,7 @@ static mp_rom_error_text_t init_card(sdcardio_sdcard_obj_t *self) { } if (csd_version == 1) { - self->sectors = ((csd[8] << 8 | csd[9]) + 1) * 1024; + self->sectors = (((uint32_t)(csd[7] & 0x3F) << 16 | (uint32_t)csd[8] << 8 | csd[9]) + 1) * 1024; } else { uint32_t block_length = 1 << (csd[5] & 0xF); uint32_t c_size = ((csd[6] & 0x3) << 10) | (csd[7] << 2) | ((csd[8] & 0xC) >> 6); From 26427a2c52d6a22bd33b64b2d8de94b56d3b42f0 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 19 May 2026 14:21:52 -0400 Subject: [PATCH 2/2] remove unneeded uint32_t casts --- shared-module/sdcardio/SDCard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/sdcardio/SDCard.c b/shared-module/sdcardio/SDCard.c index cadd2ba8a094a..def893cfb55a7 100644 --- a/shared-module/sdcardio/SDCard.c +++ b/shared-module/sdcardio/SDCard.c @@ -316,7 +316,7 @@ static mp_rom_error_text_t init_card(sdcardio_sdcard_obj_t *self) { } if (csd_version == 1) { - self->sectors = (((uint32_t)(csd[7] & 0x3F) << 16 | (uint32_t)csd[8] << 8 | csd[9]) + 1) * 1024; + self->sectors = (((csd[7] & 0x3F) << 16 | csd[8] << 8 | csd[9]) + 1) * 1024; } else { uint32_t block_length = 1 << (csd[5] & 0xF); uint32_t c_size = ((csd[6] & 0x3) << 10) | (csd[7] << 2) | ((csd[8] & 0xC) >> 6);