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_rx/trunk/ntshell/fatfs/ffarch.c

    r337 r359  
    5454#include "mbed_api.h"
    5555
    56 //extern ntstdio_t ntstdio;
     56extern ntstdio_t ntstdio;
     57
     58enum ffarch_state_t {
     59        FFS_IDLE,
     60        FFS_RETRY_WAIT,
     61};
     62
     63enum ffarch_state_t ffarch_state;
     64volatile int ffarch_timer;
     65int ffarch_retry_count;
     66uint8_t mmc_rspi_prev_status;
     67
     68static void ffarch_initialize();
     69
     70/*
     71 * FatFSタスク
     72 */
     73void ffarch_task(intptr_t exinf)
     74{
     75        ER ret, ret2;
     76        SYSTIM prev, now;
     77        int timer;
     78
     79        ffarch_initialize();
     80
     81        ret2 = get_tim(&now);
     82        if (ret2 != E_OK){
     83                ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
     84                        itron_strerror(ret2));
     85                return;
     86        }
     87
     88        for(;;){
     89                prev = now;
     90
     91                /* タイマー取得 */
     92                timer = ffarch_get_timer();
     93
     94                /* 待ち */
     95                ret = tslp_tsk(timer);
     96                if ((ret != E_OK) && (ret != E_TMOUT)) {
     97                        ntstdio_printf(&ntstdio, "[ffarch] tslp_tsk error: %s %d",
     98                                itron_strerror(ret), timer);
     99                        break;
     100                }
     101
     102                ret2 = get_tim(&now);
     103                if (ret2 != E_OK) {
     104                        ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
     105                                itron_strerror(ret2));
     106                        break;
     107                }
     108
     109                /* 時間経過 */
     110                int elapse = now - prev;
     111                ffarch_progress(elapse);
     112
     113                /* タイムアウト処理 */
     114                ffarch_timeout();
     115        }
     116}
    57117
    58118FATFS RomDisk;
     
    88148        //sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
    89149
    90         result = SD_begin() ? 0 : -1;
    91         if (result == 0) {
    92                 printf("SD card (1:) OK!\n");
     150        ffarch_state = FFS_IDLE;
     151        ffarch_timer = 0;
     152        ffarch_retry_count = 3;
     153        mmc_rspi_prev_status = STA_NODISK;
     154
     155        ffarch_timeout();
     156
     157        act_tsk(FFARCH_TASK);
     158
     159        if (romdisk_init()) {
     160                ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
    93161        }
    94162        else {
    95                 printf("SD card (1:) NG!\n");
    96         }
     163                ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
     164        }
     165
     166        serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
     167}
     168
     169void ffarch_initialize()
     170{
    97171        sta_cyc(MMC_RSPI_CYC);
    98 
    99         if (romdisk_init())
    100                 result = 0;
    101 
    102         if (result == 0) {
    103                 printf("ROM disk (0:) OK!\n");
    104         }
    105         else {
    106                 printf("ROM disk (0:) NG!\n");
    107         }
    108 
    109         /* uploadディレクトリを作成しておく */
    110         f_mkdir("1:/upload");
    111 
    112         serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
    113 
    114         return result;
    115172}
    116173
     
    216273        }
    217274        return RES_PARERR;
     275}
     276
     277void mmc_rspi_status_changed(DSTATUS newst)
     278{
     279        if (ffarch_state == FFS_IDLE) {
     280                mmc_rspi_prev_status = mmc_rspi_status();
     281                ffarch_timer = 0;
     282                wup_tsk(FFARCH_TASK);
     283        }
     284}
     285
     286int ffarch_get_timer()
     287{
     288        return ffarch_timer;
     289}
     290
     291void ffarch_progress(int elapse)
     292{
     293        if (ffarch_timer != TMO_FEVR) {
     294                ffarch_timer -= elapse;
     295                if (ffarch_timer < 0) {
     296                        ffarch_timer = 0;
     297                }
     298        }
     299}
     300
     301void ffarch_timeout()
     302{
     303        if (ffarch_timer != 0)
     304                return;
     305
     306        switch (ffarch_state) {
     307        case FFS_RETRY_WAIT:
     308                if (ffarch_retry_count == 0) {
     309                        ntstdio_printf(&ntstdio, "SD card (1:) initialize tired...\n");
     310
     311                        ffarch_state = FFS_IDLE;
     312                        ffarch_timer = TMO_FEVR;
     313                        ffarch_retry_count = 3;
     314                        break;
     315                }
     316                ffarch_retry_count--;
     317                //goto case FFS_IDLE;
     318        case FFS_IDLE:
     319                /* SDカードが入れられた場合 */
     320                if (((mmc_rspi_prev_status & STA_NODISK) != 0) && ((mmc_rspi_status() & STA_NODISK) == 0)) {
     321                        ntstdio_printf(&ntstdio, "SD card initializing ...\n");
     322
     323                        Sd.FatFs.fs_type = 0;
     324                        if (SD_begin()) {
     325                                ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
     326
     327                                /* uploadディレクトリを作成しておく */
     328                                f_mkdir("1:/upload");
     329
     330                                ffarch_state = FFS_IDLE;
     331                                ffarch_timer = TMO_FEVR;
     332                                ffarch_retry_count = 3;
     333                        }
     334                        else {
     335                                ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
     336                                ffarch_state = FFS_RETRY_WAIT;
     337                                ffarch_timer = 1000 * 1000;
     338                        }
     339                }
     340                /* SDカードが抜かれた場合 */
     341                else if (((mmc_rspi_prev_status & STA_NODISK) == 0) && ((mmc_rspi_status() & STA_NODISK) != 0)) {
     342                        ntstdio_printf(&ntstdio, "SD card unmount\n");
     343
     344                        f_mount(&Sd.FatFs, "1:", 0);
     345                        ffarch_state = FFS_IDLE;
     346                        ffarch_timer = TMO_FEVR;
     347                        ffarch_retry_count = 3;
     348                }
     349                mmc_rspi_prev_status = mmc_rspi_status();
     350                break;
     351        }
    218352}
    219353
Note: See TracChangeset for help on using the changeset viewer.