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

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

Location:
asp3_tinet_ecnl_arm/trunk/ntshell
Files:
8 edited

Legend:

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

    r352 r359  
    5353#include "util/ntstdio.h"
    5454
    55 //extern ntstdio_t ntstdio;
     55extern ntstdio_t ntstdio;
     56
     57enum ffarch_state_t {
     58        FFS_IDLE,
     59        FFS_RETRY_WAIT,
     60};
     61
     62enum ffarch_state_t ffarch_state;
     63volatile int ffarch_timer;
     64int ffarch_retry_count;
     65uint8_t sdfs_new_status, sdfs_prev_status;
     66
     67static void ffarch_initialize();
     68
     69/*
     70 * FatFSタスク
     71 */
     72void ffarch_task(intptr_t exinf)
     73{
     74        ER ret, ret2;
     75        SYSTIM prev, now;
     76        int timer;
     77
     78        ffarch_initialize();
     79
     80        ret2 = get_tim(&now);
     81        if (ret2 != E_OK){
     82                ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
     83                        itron_strerror(ret2));
     84                return;
     85        }
     86
     87        for(;;){
     88                prev = now;
     89
     90                /* タイマー取得 */
     91                timer = ffarch_get_timer();
     92
     93                /* 待ち */
     94                ret = tslp_tsk(timer);
     95                if ((ret != E_OK) && (ret != E_TMOUT)) {
     96                        ntstdio_printf(&ntstdio, "[ffarch] tslp_tsk error: %s %d",
     97                                itron_strerror(ret), timer);
     98                        break;
     99                }
     100
     101                ret2 = get_tim(&now);
     102                if (ret2 != E_OK) {
     103                        ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
     104                                itron_strerror(ret2));
     105                        break;
     106                }
     107
     108                /* 時間経過 */
     109                int elapse = now - prev;
     110                ffarch_progress(elapse);
     111
     112                /* タイムアウト処理 */
     113                ffarch_timeout();
     114        }
     115}
    56116
    57117FATFS RomDisk;
     
    71131bool_t SD_begin();
    72132
    73 int ffarch_init()
    74 {
    75         int result = -1;
    76 
     133void ffarch_init()
     134{
    77135        /* SD_CD */
    78136        gpio_init_in(&ins, P7_8);
     
    81139        sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
    82140
    83         result = SD_begin() ? 0 : -1;
    84         if (result == 0) {
    85                 printf("SD card (1:) OK!\n");
     141        ffarch_state = FFS_IDLE;
     142        ffarch_timer = 0;
     143        ffarch_retry_count = 3;
     144        sdfs_new_status = 0;
     145        sdfs_prev_status = STA_NODISK;
     146
     147        ffarch_timeout();
     148
     149        act_tsk(FFARCH_TASK);
     150
     151        if (romdisk_init()) {
     152                ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
    86153        }
    87154        else {
    88                 printf("SD card (1:) NG!\n");
    89         }
     155                ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
     156        }
     157
     158        serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
     159}
     160
     161void ffarch_initialize()
     162{
    90163        sta_cyc(SDFS_CYC);
    91 
    92         if (romdisk_init())
    93                 result = 0;
    94 
    95         if (result == 0) {
    96                 printf("ROM disk (0:) OK!\n");
    97         }
    98         else {
    99                 printf("ROM disk (0:) NG!\n");
    100         }
    101 
    102         /* uploadディレクトリを作成しておく */
    103         f_mkdir("1:/upload");
    104 
    105         serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
    106 
    107         return result;
    108164}
    109165
     
    173229                return ramdisk_get_status();
    174230        case 1:
    175                 return sdfs_status(&sdfs);
     231                return sdfs._is_initialized;
    176232        }
    177233        return STA_NOINIT;
     
    200256}
    201257
     258DRESULT sdfs_ioctl(BYTE ctrl, void *buff);
     259
    202260DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
    203261{
     
    206264                return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
    207265        case 1:
    208                 switch(cmd) {
    209                 case CTRL_SYNC:
    210                         return sdfs_sync(&sdfs);
    211                 case GET_SECTOR_COUNT:
    212                         return sdfs_sectors(&sdfs);
    213                 case GET_BLOCK_SIZE:
    214                         *((DWORD*)buff) = 1; // default when not known
    215                         return RES_OK;
    216                 }
     266                return sdfs_ioctl(cmd, buff);
    217267        }
    218268        return RES_PARERR;
    219269}
    220270
     271DRESULT sdfs_ioctl(BYTE ctrl, void *buff)
     272{
     273        DRESULT res;
     274        uint32_t *dp = (uint32_t *)buff, st, ed;
     275        uint8_t *ptr = (uint8_t *)buff;
     276
     277        if (sdfs._is_initialized & STA_NOINIT)
     278                return RES_NOTRDY;
     279
     280        res = RES_ERROR;
     281
     282        switch (ctrl) {
     283        case CTRL_SYNC:
     284                if (sdfs_sync(&sdfs) == 0) {
     285                        res = RES_OK;
     286                }
     287                break;
     288        case GET_SECTOR_SIZE:
     289                *(WORD*)buff = 512;
     290                res = RES_OK;
     291                break;
     292        case GET_SECTOR_COUNT:
     293                *(DWORD*)buff = sdfs._capacity / 512;
     294                res = RES_OK;
     295                break;
     296        case GET_BLOCK_SIZE:
     297                *(DWORD*)buff = sdfs._block_len;
     298                res = RES_OK;
     299                break;
     300        case CTRL_TRIM:
     301                res = sdfs_trim(&sdfs, dp[0], dp[1]);
     302                break;
     303        case MMC_GET_TYPE:
     304                *ptr = sdfs._card_type;
     305                res = RES_OK;
     306                break;
     307        case MMC_GET_CSD:
     308                memcpy(ptr, sdfs._csd, sizeof(sdfs._csd));
     309                res = RES_OK;
     310                break;
     311        case MMC_GET_CID:
     312                memcpy(ptr, sdfs._cid, sizeof(sdfs._cid));
     313                res = RES_OK;
     314                break;
     315        case MMC_GET_OCR:
     316                if (sdfs_get_ocr(&sdfs, buff) == 0) {
     317                        res = RES_OK;
     318                }
     319                break;
     320        case MMC_GET_SDSTAT:
     321                if (sdfs_get_sdstat(&sdfs, buff) == 0) {
     322                        res = RES_OK;
     323                }
     324                break;
     325        default:
     326                res = RES_PARERR;
     327        }
     328
     329        return res;
     330}
     331
    221332void sdfs_cychdr(intptr_t exinf)
    222333{
    223         BYTE s;
    224 
    225         s = sdfs._is_initialized;
    226         if (WP())               /* Write protected */
     334        BYTE s = 0;
     335             
     336        /* Write protected */
     337        if (WP())
    227338                s |= STA_PROTECT;
    228         else            /* Write enabled */
     339        else
    229340                s &= ~STA_PROTECT;
    230         if (gpio_read(&ins))    /* Card is in socket */
     341
     342        /* Card is in socket */
     343        if (gpio_read(&ins))
     344                s |= (STA_NODISK | STA_NOINIT);
     345        else
    231346                s &= ~STA_NODISK;
    232         else            /* Socket empty */
    233                 s |= (STA_NODISK | STA_NOINIT);
    234         sdfs._is_initialized = s;
     347
     348        sdfs_new_status = s;
     349
     350        if ((sdfs_prev_status != sdfs_new_status) && (ffarch_state == FFS_IDLE)) {
     351                ffarch_timer = 0;
     352                wup_tsk(FFARCH_TASK);
     353        }
     354}
     355
     356int ffarch_get_timer()
     357{
     358        return ffarch_timer;
     359}
     360
     361void ffarch_progress(int elapse)
     362{
     363        if (ffarch_timer != TMO_FEVR) {
     364                ffarch_timer -= elapse;
     365                if (ffarch_timer < 0) {
     366                        ffarch_timer = 0;
     367                }
     368        }
     369}
     370
     371void ffarch_timeout()
     372{
     373        if (ffarch_timer != 0)
     374                return;
     375
     376        switch (ffarch_state) {
     377        case FFS_RETRY_WAIT:
     378                if (ffarch_retry_count == 0) {
     379                        ntstdio_printf(&ntstdio, "SD card (1:) initialize tired...\n");
     380
     381                        ffarch_state = FFS_IDLE;
     382                        ffarch_timer = TMO_FEVR;
     383                        ffarch_retry_count = 3;
     384                        break;
     385                }
     386                ffarch_retry_count--;
     387                //goto case FFS_IDLE;
     388        case FFS_IDLE:
     389                /* SDカードが入れられた場合 */
     390                if ((sdfs._is_initialized & STA_NOINIT)
     391                        || (((sdfs_prev_status & STA_NODISK) != 0) && ((sdfs_new_status & STA_NODISK) == 0))) {
     392                        ntstdio_printf(&ntstdio, "SD card initializing ...\n");
     393
     394                        if (SD_begin()) {
     395                                ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
     396
     397                                /* uploadディレクトリを作成しておく */
     398                                f_mkdir("1:/upload");
     399
     400                                ffarch_state = FFS_IDLE;
     401                                ffarch_timer = TMO_FEVR;
     402                                ffarch_retry_count = 3;
     403                        }
     404                        else {
     405                                ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
     406                                ffarch_state = FFS_RETRY_WAIT;
     407                                ffarch_timer = 1000 * 1000;
     408                        }
     409                }
     410                /* SDカードが抜かれた場合 */
     411                else if (((sdfs_prev_status & STA_NODISK) == 0) && ((sdfs_new_status & STA_NODISK) != 0)) {
     412                        ntstdio_printf(&ntstdio, "SD card unmount\n");
     413
     414                        f_mount(&Sd.FatFs, "1:", 0);
     415                        ffarch_state = FFS_IDLE;
     416                        ffarch_timer = TMO_FEVR;
     417                        ffarch_retry_count = 3;
     418                }
     419                if (((sdfs_prev_status ^ sdfs_new_status) & STA_PROTECT) != 0) {
     420                        if ((sdfs_new_status & STA_PROTECT) != 0)
     421                                sdfs._is_initialized |= STA_PROTECT;
     422                        else
     423                                sdfs._is_initialized &= ~STA_PROTECT;
     424                }
     425                sdfs_prev_status = sdfs_new_status;
     426                break;
     427        }
    235428}
    236429
  • asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/ffarch.cfg

    r352 r359  
    3838#include "ffarch.h"
    3939
     40CRE_TSK(FFARCH_TASK, { TA_NULL, 0, ffarch_task, FFARCH_PRIORITY, FFARCH_STACK_SIZE, NULL });
    4041CRE_CYC(SDFS_CYC, { TA_NULL, { TNFY_HANDLER, 0, sdfs_cychdr }, 1000000, 0 });
    4142
  • asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/ffarch.h

    r352 r359  
    3838#define _FFARCH_H_
    3939
    40 int ffarch_init();
     40#define FFARCH_PRIORITY                 5
     41#define FFARCH_STACK_SIZE               512
     42
     43void ffarch_init();
     44void ffarch_task(intptr_t exinf);
     45int ffarch_get_timer();
     46void ffarch_progress(int elapse);
     47void ffarch_timeout();
     48
    4149void sdfs_cychdr(intptr_t exinf);
    4250
  • 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}
  • asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/sdfs.h

    r352 r359  
    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
     
    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
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/fdtable.c

    r352 r359  
    400400                FD_SET(fd, (fd_set *)&flgptn);
    401401        }
    402         if (rpor.wricnt < rpor.wbufsz) {
     402        if (rpor.wricnt != 0) {
    403403                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    404404
     
    428428                FD_SET(fd, (fd_set *)flgptn);
    429429        }
    430         if (rpor.wricnt < rpor.wbufsz) {
     430        if (rpor.wricnt != 0) {
    431431                if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++;
    432432
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/net_misc.c

    r352 r359  
    6060#include "kernel_cfg.h"
    6161#include "tinet_cfg.h"
     62#include "util/ntstdio.h"
     63
     64extern ntstdio_t ntstdio;
    6265
    6366T_DHCP4_CLI_CONTEXT *dhcp4_cli_initialize(ID tskid, ID cepid);
     
    9497
    9598        get_tid(&nc->tskid);
    96         syslog(LOG_NOTICE, "[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
     99        ntstdio_printf(&ntstdio, "[NET MISC:%d,%d] started.", nc->tskid, (ID)exinf);
    97100
    98101        /* 初期化 */
     
    102105        ret = get_tim(&time);
    103106        if (ret != E_OK) {
    104                 syslog(LOG_NOTICE, "[NET MISC,%d] get_tim error: %7lu,%s",
     107                ntstdio_printf(&ntstdio, "[NET MISC,%d] get_tim error: %7lu,%s",
    105108                        nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
    106109                return;
     
    116119                error = tslp_tsk(timer);
    117120                if ((error != E_OK) && (error != E_TMOUT)) {
    118                         syslog(LOG_NOTICE, "[NET MISC,%d] tslp_tsk error: %s %d",
     121                        ntstdio_printf(&ntstdio, "[NET MISC,%d] tslp_tsk error: %s %d",
    119122                                nc->cepid, itron_strerror(error), timer);
    120123                        break;
     
    123126                ret = get_tim(&time);
    124127                if (ret != E_OK) {
    125                         syslog(LOG_NOTICE, "[NET MISC,%d] get_tim error: %s",
     128                        ntstdio_printf(&ntstdio, "[NET MISC,%d] get_tim error: %s",
    126129                                nc->cepid, itron_strerror(ret));
    127130                        break;
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/ntp_cli.c

    r352 r359  
    5050#include <t_syslog.h>
    5151#include "kernel_cfg.h"
     52#include "util/ntstdio.h"
     53
     54extern ntstdio_t ntstdio;
    5255
    5356#endif  /* of #if defined(TARGET_KERNEL_ASP) */
     
    276279        }
    277280
    278         syslog(LOG_NOTICE, "[NTP CLI,%d] recv time: %s .%09u",
     281        ntstdio_printf(&ntstdio, "[NTP CLI,%d] recv time: %s .%09u\n",
    279282                nc->cepid, nc->buf, tp.tv_nsec);
    280283}
     
    308311                line = lookup_ipaddr(&nc->ipaddr6, NTP_SRV_URL, API_PROTO_IPV4);
    309312                if (line == NULL || !in6_is_addr_ipv4mapped(&nc->ipaddr6)) {
    310                         syslog(LOG_NOTICE, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
     313                        ntstdio_printf(&ntstdio, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
    311314                                nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
    312315                        nc->timer = SLP_ITV;
     
    316319#else   /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) */
    317320                if ((line = lookup_ipaddr(&nc->snd_rmt.ipaddr, NTP_SRV_URL, DEFAULT_API_PROTO)) == NULL) {
    318                         syslog(LOG_NOTICE, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
     321                        ntstdio_printf(&ntstdio, "[NTP CLI,%d] sleep %d.%03u[s], unknown host.",
    319322                                nc->cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
    320323                        nc->timer = SLP_ITV;
     
    420423
    421424        if ((error = udp_snd_dat(nc->cepid, &nc->snd_rmt, ntp, len, TMO_NBLK)) != E_WBLK) {
    422                 syslog(LOG_NOTICE, "[NTP CLI,%d] udp_snd_dat error: %s",
     425                ntstdio_printf(&ntstdio, "[NTP CLI,%d] udp_snd_dat error: %s",
    423426                        nc->cepid, itron_strerror(error));
    424427                return error;
     
    438441        ret = get_tim(&time);
    439442        if (ret != E_OK) {
    440                 syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %s",
     443                ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %s",
    441444                        nc->cepid, itron_strerror(ret));
    442445                tp->tv_sec = 0;
     
    458461        ret = set_tim(time);
    459462        if (ret != E_OK) {
    460                 syslog(LOG_NOTICE, "[NTP CLI,%d] set_tim error: %s",
     463                ntstdio_printf(&ntstdio, "[NTP CLI,%d] set_tim error: %s",
    461464                        nc->cepid, itron_strerror(ret));
    462465        }
     
    476479        if (len < 0 && len != E_RLWAI) {
    477480                /* E_RLWAI 以外で、0 以下の場合は、エラーを意味している。*/
    478                 syslog(LOG_NOTICE, "[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
     481                ntstdio_printf(&ntstdio, "[NTP CLI,%d] callback error: %s, fncd: %s", nc->cepid,
    479482                        itron_strerror(len), in_strtfn(fncd));
    480483        }
     
    483486                        if ((len = udp_rcv_dat(nc->cepid, &nc->rcv_rmt, &nc->ntp_msg, len, TMO_POL)) < 0)
    484487                        {
    485                                 syslog(LOG_NOTICE, "[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
     488                                ntstdio_printf(&ntstdio, "[NTP CLI,%d] udp_rcv_dat error: %s", nc->cepid,
    486489                                        itron_strerror(len));
    487490                        }
     
    515518
    516519        get_tid(&nc->tskid);
    517         syslog(LOG_NOTICE, "[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
     520        ntstdio_printf(&ntstdio, "[NTP CLI:%d,%d] started.", nc->tskid, (ID)exinf);
    518521
    519522        /* 初期化 */
     
    522525        ret = get_tim(&time);
    523526        if (ret != E_OK) {
    524                 syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %7lu,%s",
     527                ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %7lu,%s",
    525528                        nc->cepid, time / SYSTIM_HZ, itron_strerror(ret));
    526529                return;
     
    536539                error = tslp_tsk(timer);
    537540                if ((error != E_OK) && (error != E_TMOUT)) {
    538                         syslog(LOG_NOTICE, "[NTP CLI,%d] tslp_tsk error: %s %d",
     541                        ntstdio_printf(&ntstdio, "[NTP CLI,%d] tslp_tsk error: %s %d",
    539542                                nc->cepid, itron_strerror(error), timer);
    540543                        break;
     
    543546                ret = get_tim(&time);
    544547                if (ret != E_OK) {
    545                         syslog(LOG_NOTICE, "[NTP CLI,%d] get_tim error: %s",
     548                        ntstdio_printf(&ntstdio, "[NTP CLI,%d] get_tim error: %s",
    546549                                nc->cepid, itron_strerror(ret));
    547550                        break;
Note: See TracChangeset for help on using the changeset viewer.