From 9ca33ea611588ac0e58031777d2916db7831513e Mon Sep 17 00:00:00 2001 From: Mikey Sklar Date: Mon, 26 May 2025 17:37:24 -0700 Subject: [PATCH] macos support for msc Changing from multi-block writes to single block worked for macos and ubuntu. I was able to mount read and write both flash and microSD using a Metro RP2040. --- examples/MassStorage/.DS_Store | Bin 0 -> 6148 bytes .../msc_external_flash_sdcard.ino | 34 ++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 examples/MassStorage/.DS_Store diff --git a/examples/MassStorage/.DS_Store b/examples/MassStorage/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fa38b7ff3d5beb77973a053c761c9b73d678d478 GIT binary patch literal 6148 zcmeHKJ5B>Z41FdkBGIITZmz%$Mo~CH4iHvZK1Eoh1W?NDxHiupqO5jlDUdDMZ^mPL zG_P2%0m$m3y#tm27F0!isTqr&tB&LMNd04_ZF`>Vu$S@zrmiK zC)$RmFI*qdGOA(q_H%RS_HW&@-#lG9y~#i_kPIXP$v`qN!GQK&%HrBFZ8DGyBm-v# z^!re#iZ!rzv`+_(jR3?s-6mYyEI};lAlAU%ksgY8D$!FVMhx+E`b)&sz~0f*Au)VN z+$=Gnh~3Wm#lj)gF>NxC3=A2V`F5%O|DO8G{69>}T{4gi{3`}zzTT`?d{Xq*(c`q& v7U~1_M;L42G}elV){42&R(x|2S9Hzu8rVBpI{lVT%pU>eB_$d73kJRcMSL3? literal 0 HcmV?d00001 diff --git a/examples/MassStorage/msc_external_flash_sdcard/msc_external_flash_sdcard.ino b/examples/MassStorage/msc_external_flash_sdcard/msc_external_flash_sdcard.ino index 4b7b6e15..9f24edf0 100644 --- a/examples/MassStorage/msc_external_flash_sdcard/msc_external_flash_sdcard.ino +++ b/examples/MassStorage/msc_external_flash_sdcard/msc_external_flash_sdcard.ino @@ -214,15 +214,17 @@ void loop() { // SD Card callbacks //--------------------------------------------------------------------+ -int32_t sdcard_read_cb (uint32_t lba, void* buffer, uint32_t bufsize) -{ - bool rc; - -#if SD_FAT_VERSION >= 20000 - rc = sd.card()->readSectors(lba, (uint8_t*) buffer, bufsize/512); -#else - rc = sd.card()->readBlocks(lba, (uint8_t*) buffer, bufsize/512); -#endif +int32_t sdcard_read_cb (uint32_t lba, void* buffer, uint32_t bufsize) { + bool rc = true; + uint8_t* buf = (uint8_t*)buffer; + + // Perform each sector with a single-block CMD17 + for (uint32_t i = 0; i < bufsize/512; i++) { + if (!sd.card()->readBlock(lba + i, buf + i*512)) { + rc = false; + break; + } + } return rc ? bufsize : -1; } @@ -231,17 +233,19 @@ int32_t sdcard_read_cb (uint32_t lba, void* buffer, uint32_t bufsize) // Process data in buffer to disk's storage and // return number of written bytes (must be multiple of block size) int32_t sdcard_write_cb (uint32_t lba, uint8_t* buffer, uint32_t bufsize) { - bool rc; + bool rc = true; #ifdef LED_BUILTIN digitalWrite(LED_BUILTIN, HIGH); #endif -#if SD_FAT_VERSION >= 20000 - rc = sd.card()->writeSectors(lba, buffer, bufsize/512); -#else - rc = sd.card()->writeBlocks(lba, buffer, bufsize/512); -#endif + // Perform each 512-byte sector as a single-block CMD24 + for (uint32_t i = 0; i < bufsize/512; i++) { + if (!sd.card()->writeBlock(lba + i, buffer + i*512)) { + rc = false; + break; + } + } return rc ? bufsize : -1; }