From 2487f50be6c4d0d49446595c8a249b8304a2a673 Mon Sep 17 00:00:00 2001 From: Michael Moon Date: Mon, 19 Nov 2012 23:45:48 +1100 Subject: [PATCH] SDHC support --- src/libs/USBDevice/USBMSD/SDCard.cpp | 90 +++++++++++++++------------- src/libs/USBDevice/USBMSD/SDCard.h | 2 +- src/main.cpp | 2 +- 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/libs/USBDevice/USBMSD/SDCard.cpp b/src/libs/USBDevice/USBMSD/SDCard.cpp index f0e6bc57..d7c27ca9 100644 --- a/src/libs/USBDevice/USBMSD/SDCard.cpp +++ b/src/libs/USBDevice/USBMSD/SDCard.cpp @@ -191,6 +191,8 @@ SDCard::SDCard(PinName mosi, PinName miso, PinName sclk, PinName cs) : #define SD_ACMD_SET_CLR_CARD_DETECT 42 #define SD_ACMD_SEND_CSR 51 +#define SD_CARD_HIGH_CAPACITY (1UL<<30) + #define BLOCK2ADDR(block) (((cardtype == SDCARD_V1) || (cardtype == SDCARD_V2))?(block << 9):((cardtype == SDCARD_V2HC)?(block):0)) SDCard::CARD_TYPE SDCard::initialise_card() { @@ -236,9 +238,13 @@ SDCard::CARD_TYPE SDCard::initialise_card_v2() { for(int i=0; i= 512) + return blocknr * (block_len >> 9); + else + return (blocknr * block_len) >> 9; } + else if (csd_structure == 1) + { + if (cardtype != SDCARD_V2HC) + { + fprintf(stderr, "SD V1 or V2 card with SDHC descriptor!\n"); + return 0; + } + uint32_t c_size = ext_bits(csd, 69, 48); + uint32_t blocknr = (c_size + 1) * 1024; - // memory capacity = BLOCKNR * BLOCK_LEN - // where - // BLOCKNR = (C_SIZE+1) * MULT - // MULT = 2^(C_SIZE_MULT+2) (C_SIZE_MULT < 8) - // BLOCK_LEN = 2^READ_BL_LEN, (READ_BL_LEN < 12) - - uint32_t block_len = 1 << read_bl_len; - uint32_t mult = 1 << (c_size_mult + 2); - uint32_t blocknr = (c_size + 1) * mult; - -// uint32_t capacity = blocknr * block_len; - -// uint32_t blocks = capacity / 512; -// uint32_t blocks; - - if (block_len >= 512) return blocknr * (block_len >> 9); - else return (blocknr * block_len) >> 9; - -// return blocks; + return blocknr; + } + fprintf(stderr, "This disk tastes funny! (%d) I only know about type 0 or 1 CSD structures\n", csd_structure); + return 0; } diff --git a/src/libs/USBDevice/USBMSD/SDCard.h b/src/libs/USBDevice/USBMSD/SDCard.h index a6e7ade4..26191e23 100644 --- a/src/libs/USBDevice/USBMSD/SDCard.h +++ b/src/libs/USBDevice/USBMSD/SDCard.h @@ -88,7 +88,7 @@ protected: int _cmd(int cmd, uint32_t arg); int _cmdx(int cmd, uint32_t arg); int _cmd8(); - int _cmd58(); + int _cmd58(uint32_t*); CARD_TYPE initialise_card(); CARD_TYPE initialise_card_v1(); CARD_TYPE initialise_card_v2(); diff --git a/src/main.cpp b/src/main.cpp index 3678cecb..3ba34b5a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ #include "modules/utils/configurator/Configurator.h" #include "modules/utils/currentcontrol/CurrentControl.h" #include "modules/utils/pausebutton/PauseButton.h" -#include "libs/ChaNFSSD/SDFileSystem.h" +// #include "libs/ChaNFSSD/SDFileSystem.h" #include "libs/Config.h" #include "libs/nuts_bolts.h" #include "libs/utils.h" -- 2.20.1