Ignore:
Timestamp:
Jun 20, 2018, 7:59:22 PM (6 years ago)
Author:
coas-nagasima
Message:

SDカードの挿抜を検知するよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/sdfs.c

    r352 r359  
    115115        */
    116116#include "sdfs.h"
     117#include "diskio.h"
    117118//#include "mbed_debug.h"
    118119#include "mbed_wait_api.h"
    119 
    120 #define debug(str, ...)
    121 #define debug_if(cond, strt, ...) if(cond){ debug(str, __ARGS__); }
     120#include "util/ntstdio.h"
     121
     122extern ntstdio_t ntstdio;
     123#define debug(...) ntstdio_printf(&ntstdio, __VA_ARGS__)
     124#define debug_if(cond, ...) if(cond){ ntstdio_printf(&ntstdio, __VA_ARGS__); }
    122125
    123126static int sdfs_initialise_card_v1(sdfs_t *obj);
     
    144147    obj->_init_sck = 100000;
    145148    obj->_transfer_sck = 1000000;
     149        obj->_is_initialized = STA_NOINIT;
    146150}
    147151
     
    154158#define R1_PARAMETER_ERROR      (1 << 6)
    155159
    156 // Types
    157 #define SDCARD_FAIL 0 //!< v1.x Standard Capacity
    158 #define SDCARD_V1   1 //!< v2.x Standard Capacity
    159 #define SDCARD_V2   2 //!< v2.x High Capacity
    160 #define SDCARD_V2HC 3 //!< Not recognised as an SD Card
    161 
    162160int sdfs_initialise_card(sdfs_t *obj)
    163161{
     
    173171        if (sdfs__cmd(obj, 0, 0) != R1_IDLE_STATE) {
    174172                debug("No disk, or could not put SD card in to SPI idle state\n");
    175                 return SDCARD_FAIL;
     173                return CT_FAIL;
    176174        }
    177175
     
    186184        else {
    187185                debug("Not in idle state after sending CMD8 (not an SD card?)\n");
    188                 return SDCARD_FAIL;
     186                return CT_FAIL;
    189187        }
    190188}
     
    192190static int sdfs_initialise_card_v1(sdfs_t *obj)
    193191{
     192        sdfs__cmd(obj, 55, 0);
     193        if (sdfs__cmd(obj, 41, 0) <= 1) {
     194                obj->cdv = 512;
     195                debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r");
     196                for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
     197                        sdfs__cmd(obj, 55, 0);
     198                        if (sdfs__cmd(obj, 41, 0) == 0) {
     199                                break;
     200                        }
     201                }
     202                return CT_SD1;
     203        }
     204        else {
     205                for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
     206                        if (sdfs__cmd(obj, 1, 0) == 0)
     207                                break;
     208                }
     209                return CT_MMC;
     210        }
     211        //if (!Timer1 || sdfs__cmd(obj, 16, 512) != 0)  /* Set block length: 512 */
     212        //      ty = 0;
     213
     214        debug("Timeout waiting for v1.x card\n");
     215        return CT_FAIL;
     216}
     217
     218static int sdfs_initialise_card_v2(sdfs_t *obj)
     219{
     220        int n;
     221        uint8_t ocr[4];
     222
     223        /* Get 32 bit return value of R7 resp */
     224        for (n = 0; n < 4; n++) ocr[n] = spi_master_write(&obj->_spi, 0xFF);
    194225        for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
    195226                sdfs__cmd(obj, 55, 0);
    196                 if (sdfs__cmd(obj, 41, 0) == 0) {
    197                         obj->cdv = 512;
    198                         debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r");
    199                         return SDCARD_V1;
    200                 }
    201         }
    202 
    203         debug("Timeout waiting for v1.x card\n");
    204         return SDCARD_FAIL;
    205 }
    206 
    207 static int sdfs_initialise_card_v2(sdfs_t *obj)
    208 {
    209         for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
     227                if (sdfs__cmd(obj, 41, 0x40000000) == 0) {
     228                        if (sdfs__cmd58(obj) == 0) {
     229                                for (n = 0; n < 4; n++) ocr[n] = spi_master_write(&obj->_spi, 0xFF);
     230                                debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");
     231                                obj->cdv = 1;
     232                                return (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;
     233                        }
     234                }
    210235                wait_ms(50);
    211                 sdfs__cmd58(obj);
    212                 sdfs__cmd(obj, 55, 0);
    213                 if (sdfs__cmd(obj, 41, 0x40000000) == 0) {
    214                         sdfs__cmd58(obj);
    215                         debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");
    216                         obj->cdv = 1;
    217                         return SDCARD_V2;
    218                 }
    219236        }
    220237
    221238        debug("Timeout waiting for v2.x card\n");
    222         return SDCARD_FAIL;
     239        return CT_FAIL;
    223240}
    224241
    225242int sdfs_initialize(sdfs_t *obj)
    226243{
    227         obj->_is_initialized = sdfs_initialise_card(obj);
    228         if (obj->_is_initialized == 0) {
     244        obj->_is_initialized |= STA_NOINIT;
     245
     246        obj->_card_type = sdfs_initialise_card(obj);
     247        if (obj->_card_type == 0) {
    229248                debug("Fail to initialize card\n");
    230249                return 1;
    231250        }
    232         debug_if(SD_DBG, "init card = %d\n", obj->_is_initialized);
     251        debug_if(SD_DBG, "init card = %x\n", obj->_is_initialized);
     252
    233253        obj->_sectors = sdfs__sd_sectors(obj);
     254
     255        if (sdfs__cmdx(obj, 10, 0) != 0         /* READ_CID */
     256                || sdfs__read(obj, obj->_cid, 16) != 0) {
     257                obj->_card_type = CT_FAIL;
     258                debug("Fail to read cid\n");
     259                return 1;
     260        }
    234261
    235262        // Set block length to 512 (CMD16)
    236263        if (sdfs__cmd(obj, 16, 512) != 0) {
     264                obj->_card_type = CT_FAIL;
    237265                debug("Set 512-byte block timed out\n");
    238266                return 1;
    239267        }
     268
     269        obj->_is_initialized &= ~STA_NOINIT;
    240270
    241271        // Set SCK for data transfer
     
    246276int sdfs_write(sdfs_t *obj, const uint8_t *buffer, uint32_t block_number, uint32_t count)
    247277{
    248         if (!obj->_is_initialized) {
     278        if (obj->_is_initialized & (STA_NOINIT | STA_PROTECT)) {
    249279                return -1;
    250280        }
     
    266296int sdfs_read(sdfs_t *obj, uint8_t *buffer, uint32_t block_number, uint32_t count)
    267297{
    268         if (!obj->_is_initialized) {
     298        if (obj->_is_initialized & STA_NOINIT) {
    269299                return -1;
    270300        }
     
    287317{
    288318        // FATFileSystem::disk_status() returns 0 when initialized
    289         if (obj->_is_initialized) {
     319        if ((obj->_is_initialized & STA_NOINIT) == 0) {
    290320                return 0;
    291321        }
     
    294324        }
    295325}
    296 int sdfs_sync(sdfs_t *obj) { return 0; }
     326
    297327uint64_t sdfs_sectors(sdfs_t *obj) { return obj->_sectors; }
    298328
     
    477507{
    478508        uint32_t c_size, c_size_mult, read_bl_len;
    479         uint32_t block_len, mult, blocknr, capacity;
     509        uint32_t mult, blocknr;
    480510        uint32_t hc_c_size;
    481511        uint64_t blocks;
     
    487517        }
    488518
    489         uint8_t csd[16];
    490         if (sdfs__read(obj, csd, 16) != 0) {
     519        if (sdfs__read(obj, obj->_csd, 16) != 0) {
    491520                debug("Couldn't read csd response from disk\n");
    492521                return 0;
     
    498527        // read_bl_len   : csd[83:80] - the *maximum* read block length
    499528
    500         int csd_structure = sdfs_ext_bits(obj, csd, 127, 126);
     529        int csd_structure = sdfs_ext_bits(obj, obj->_csd, 127, 126);
    501530
    502531        switch (csd_structure) {
    503532        case 0:
    504533                obj->cdv = 512;
    505                 c_size = sdfs_ext_bits(obj, csd, 73, 62);
    506                 c_size_mult = sdfs_ext_bits(obj, csd, 49, 47);
    507                 read_bl_len = sdfs_ext_bits(obj, csd, 83, 80);
    508 
    509                 block_len = 1 << read_bl_len;
     534                c_size = sdfs_ext_bits(obj, obj->_csd, 73, 62);
     535                c_size_mult = sdfs_ext_bits(obj, obj->_csd, 49, 47);
     536                read_bl_len = sdfs_ext_bits(obj, obj->_csd, 83, 80);
     537
     538                obj->_block_len = 1 << read_bl_len;
    510539                mult = 1 << (c_size_mult + 2);
    511540                blocknr = (c_size + 1) * mult;
    512                 capacity = blocknr * block_len;
    513                 blocks = capacity / 512;
    514                 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);
     541                obj->_capacity = blocknr * obj->_block_len;
     542                blocks = obj->_capacity / 512;
     543                debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, obj->_capacity, blocks);
    515544                break;
    516545
    517546        case 1:
    518547                obj->cdv = 1;
    519                 hc_c_size = sdfs_ext_bits(obj, csd, 63, 48);
     548                hc_c_size = sdfs_ext_bits(obj, obj->_csd, 63, 48);
    520549                blocks = (hc_c_size + 1) * 1024;
    521550                debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks * 512, blocks);
     
    528557        return blocks;
    529558}
     559
     560static
     561int wait_ready(sdfs_t *obj, uint32_t wt)
     562{
     563        /* Wait until card goes ready or timeout */
     564        for (int i = 0; i < wt; i++) {
     565                if (spi_master_write(&obj->_spi, 0xFF) == 0xFF)
     566                        /* Card goes ready */
     567                        return 1;
     568        }
     569
     570        /* Timeout occured */
     571        return 0;
     572}
     573
     574static
     575void deselect(sdfs_t *obj)
     576{
     577        /* Set CS# high */
     578        gpio_write(&obj->_cs, 0);
     579
     580        /* Dummy clock (force DO hi-z for multiple slave SPI) */
     581        spi_master_write(&obj->_spi, 0xFF);
     582}
     583
     584static
     585int select(sdfs_t *obj)
     586{
     587        /* Set CS# low */
     588        gpio_write(&obj->_cs, 1);
     589
     590        /* Dummy clock (force DO enabled) */
     591        spi_master_write(&obj->_spi, 0xFF);
     592
     593        /* Wait for card ready */
     594        if (wait_ready(obj, 500))
     595                return 0;
     596
     597        deselect(obj);
     598
     599        /* Failed to select the card due to timeout */
     600        return -1;
     601}
     602
     603int sdfs_sync(sdfs_t *obj)
     604{
     605        int ret = select(obj);
     606        deselect(obj);
     607        return ret;
     608}
     609
     610int sdfs_trim(sdfs_t *obj, uint32_t st, uint32_t ed)
     611{
     612        int res = -1;
     613
     614        for(;;) {
     615                /* Check if the card is SDC */
     616                if (!(obj->_card_type & CT_SDC))
     617                        break;
     618                /* Check if sector erase can be applied to the card */
     619                if (!(obj->_csd[0] >> 6) && !(obj->_csd[10] & 0x40))
     620                        break;
     621                /* Load sector block */
     622                if (!(obj->_card_type & CT_BLOCK)) {
     623                        st *= 512; ed *= 512;
     624                }
     625                /* Erase sector block */
     626                if ((sdfs__cmd(obj, 32, st) == 0)
     627                        && (sdfs__cmd(obj, 33, ed) == 0)
     628                        && (sdfs__cmd(obj, 38, 0) == 0)
     629                        && wait_ready(obj, 30000))
     630                        res = 0;
     631        }
     632
     633        return res;
     634}
     635
     636int sdfs_get_ocr(sdfs_t *obj, uint8_t buff[4])
     637{
     638        int res = -1, n;
     639
     640        /* READ_OCR */
     641        if (sdfs__cmd58(obj) == 0) {
     642                for (n = 4; n; n--) {
     643                        *buff++ = spi_master_write(&obj->_spi, 0xFF);
     644                }
     645                res = 0;
     646        }
     647
     648        deselect(obj);
     649
     650        return res;
     651}
     652
     653int sdfs_get_sdstat(sdfs_t *obj, uint8_t buff[64])
     654{
     655        int res = -1;
     656
     657        sdfs__cmd(obj, 55, 0);
     658
     659        /* SD_STATUS */
     660        if (sdfs__cmd(obj, 13, 0) == 0) {
     661                spi_master_write(&obj->_spi, 0xFF);
     662                if (sdfs__read(obj, buff, 64) == 0)
     663                        return 0;
     664        }
     665
     666        deselect(obj);
     667
     668        return res;
     669}
Note: See TracChangeset for help on using the changeset viewer.