Changeset 435 for EcnlProtoTool


Ignore:
Timestamp:
Jul 5, 2020, 10:49:56 PM (4 years ago)
Author:
coas-nagasima
Message:

sdfsを更新

Location:
EcnlProtoTool/trunk/ntshell
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/ntshell/fatfs/ff.c

    r434 r435  
    1717
    1818
     19#include "shellif.h"
    1920#include "ff.h"                 /* Declarations of FatFs API */
    2021#include "diskio.h"             /* Declarations of disk I/O functions */
    2122#include "util/ntstdio.h"
    22 #include "shellif.h"
    2323
    2424/*--------------------------------------------------------------------------
     
    26172617        /* Get logical drive number */
    26182618#if !FF_FS_READONLY
    2619         mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW;
     2619        mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW | FA_OPEN_APPEND;
    26202620        res = find_volume(&dj.fs, &path, (BYTE)(mode & ~FA_READ));
    26212621#else
  • EcnlProtoTool/trunk/ntshell/fatfs/ff.h

    r434 r435  
    309309#define FA_CREATE_ALWAYS        0x08
    310310#define FA_OPEN_ALWAYS          0x10
     311#define FA_OPEN_APPEND          0x30
    311312#define FA_MODIFIED                     0x20
    312313#define FA_DIRTY                        0x40
  • EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c

    r434 r435  
    5353#include "util/ntstdio.h"
    5454
     55#define SD_CARD_LOG_LEVEL LOG_INFO
     56
    5557#define SIO_PORTID 1
    5658extern ntstdio_t ntstdio;
     
    279281}
    280282
     283void sdfs_debug(const char *fmt, ...)
     284{
     285        va_list arp;
     286
     287        va_start(arp, fmt);
     288        syslog(SD_CARD_LOG_LEVEL, fmt, arp);
     289        va_end(arp);
     290}
     291
    281292int ff_cre_syncobj(BYTE vol, FF_SYNC_t* sobj)
    282293{
     
    310321        sys_free(mblock);
    311322}
     323
     324DWORD get_fattime(void)
     325{
     326        time_t temp;
     327        struct tm _tm;
     328
     329        temp = rtc_read();
     330        gmtime_r(&temp, &_tm);
     331
     332        return    ((DWORD)(_tm.tm_year - 1980) << 25)
     333                | ((DWORD)_tm.tm_mon << 21)
     334                | ((DWORD)_tm.tm_mday << 16)
     335                | ((DWORD)_tm.tm_hour << 11)
     336                | ((DWORD)_tm.tm_min << 5)
     337                | ((DWORD)_tm.tm_sec >> 1);
     338}
  • EcnlProtoTool/trunk/ntshell/fatfs/ffconf.h

    r434 r435  
    44
    55#define FFCONF_DEF 64180        /* Revision ID */
     6
     7#define FFS_DBG                 0
    68
    79/*---------------------------------------------------------------------------/
     
    125127
    126128
     129#define FF_LFN_BUF              255
     130#define FF_SFN_BUF              12
     131/* This set of options defines size of file name members in the FILINFO structure
     132/  which is used to read out directory items. These values should be suffcient for
     133/  the file names to read. The maximum possible length of the read file name depends
     134/  on character encoding. When LFN is not enabled, these options have no effect. */
     135
     136
    127137#define FF_FS_RPATH     2
    128138/* This option configures relative path feature.
  • EcnlProtoTool/trunk/ntshell/fatfs/fftime.c

    r331 r435  
    254254        return -1;
    255255}
    256 
    257 DWORD get_fattime(void)
    258 {
    259         time_t temp;
    260         struct tm _tm;
    261 
    262         temp = rtc_read();
    263         gmtime_r(&temp, &_tm);
    264 
    265         return    ((DWORD)(_tm.tm_year - 1980) << 25)
    266                 | ((DWORD)_tm.tm_mon << 21)
    267                 | ((DWORD)_tm.tm_mday << 16)
    268                 | ((DWORD)_tm.tm_hour << 11)
    269                 | ((DWORD)_tm.tm_min << 5)
    270                 | ((DWORD)_tm.tm_sec >> 1);
    271 }
  • EcnlProtoTool/trunk/ntshell/fatfs/sdfs.c

    r429 r435  
    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
     122void sdfs_debug(const char *fmt, ...);
     123#define debug(...) sdfs_debug(__VA_ARGS__)
     124#define debug_if(cond, ...) if (cond) { sdfs_debug(__VA_ARGS__); }
    122125
    123126static int sdfs_initialise_card_v1(sdfs_t *obj);
     
    134137#define SD_DBG             0
    135138
    136 sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
     139void sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
    137140{
    138141        obj->name = name;
     
    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}
  • EcnlProtoTool/trunk/ntshell/fatfs/sdfs.h

    r331 r435  
    3434#endif
    3535
     36/* MMC card type flags (MMC_GET_TYPE) */
     37#define CT_FAIL         0x00
     38#define CT_MMC          0x01            /* MMC ver 3 */
     39#define CT_SD1          0x02            /* SD ver 1 */
     40#define CT_SD2          0x04            /* SD ver 2 */
     41#define CT_SDC          (CT_SD1|CT_SD2) /* SD */
     42#define CT_BLOCK        0x08            /* Block addressing */
     43
    3644/** Access the filesystem on an SD Card using SPI
    3745        *
     
    5159typedef struct sdfs_s{
    5260        const char* name;
     61        volatile uint8_t _is_initialized;
     62        uint8_t _card_type;
     63        uint8_t _csd[16], _cid[16];
     64        uint64_t _capacity;
     65        uint64_t _block_len;
    5366        uint64_t _sectors;
    5467        spi_t _spi;
     
    5770    uint32_t _init_sck;
    5871    uint32_t _transfer_sck;
    59         int _is_initialized;
    6072} sdfs_t;
    6173
     
    6880        * @param name The name used to access the virtual filesystem
    6981        */
    70 sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);
     82void sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);
    7183
    7284int sdfs_initialize(sdfs_t *obj);
     
    7688int sdfs_sync(sdfs_t *obj);
    7789uint64_t sdfs_sectors(sdfs_t *obj);
     90int sdfs_trim(sdfs_t *obj, uint32_t st, uint32_t ed);
     91int sdfs_get_ocr(sdfs_t *obj, uint8_t buff[4]);
     92int sdfs_get_sdstat(sdfs_t *obj, uint8_t buff[64]);
    7893
    7994#ifdef __cplusplus
  • EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.c

    r434 r435  
    330330
    331331        while ((res == FR_OK) && (fno.fname[0] != 0)) {
    332                 if (pattern_p != NULL && (fno.fattrib & AM_DIR) && ((fno.fname[0] == '.') ? (pattern_p[0] == '.') : 1)) {/* FATFS_DIR とパターンマッチしている場合は FATFS_DIR 内部を ls する */
     332                if (pattern_p != NULL && (fno.fattrib & AM_DIR) && ((fno.fname[0] == '.') ? (pattern_p[0] == '.') : 1)) {/* DIR とパターンマッチしている場合は DIR 内部を ls する */
    333333#if FF_USE_LFN
    334334                        fn = *fno.lfname ? fno.lfname : fno.fname;
     
    374374        f_closedir(&dir);
    375375
     376#if FF_USE_LFN
    376377        if (lfn                 != NULL) ff_memfree(lfn);
     378#endif
    377379        if (path_backup != NULL) ff_memfree(path_backup);
    378380}
  • EcnlProtoTool/trunk/ntshell/src/main.h

    r433 r435  
    11/*
    2  *  TOPPERS ECHONET Lite Communication Middleware
     2 *  TOPPERS PROJECT Home Network Working Group Software
    33 *
    4  *  Copyright (C) 2014-2017 Cores Co., Ltd. Japan
     4 *  Copyright (C) 2014-2019 Cores Co., Ltd. Japan
    55 *
    66 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
Note: See TracChangeset for help on using the changeset viewer.