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

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

Location:
asp3_tinet_ecnl_rx/trunk/ntshell/fatfs
Files:
5 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
  • asp3_tinet_ecnl_rx/trunk/ntshell/fatfs/ffarch.cfg

    r337 r359  
    3838#include "ffarch.h"
    3939
     40CRE_TSK(FFARCH_TASK, { TA_NULL, 0, ffarch_task, FFARCH_PRIORITY, FFARCH_STACK_SIZE, NULL });
    4041INCLUDE("mmc_rspi.cfg");
    4142
  • asp3_tinet_ecnl_rx/trunk/ntshell/fatfs/ffarch.h

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

    r343 r359  
    201201        ena_int(INTNO_MMC_RSPI_SPII);
    202202
    203         sta_cyc(MMC_RSPI_CYC);
     203        /*sta_cyc(MMC_RSPI_CYC);*/
    204204}
    205205
     
    211211void power_off(void)    /* Disable MMC/SDC interface */
    212212{
    213         stp_cyc(MMC_RSPI_CYC);
     213        /*stp_cyc(MMC_RSPI_CYC);*/
    214214
    215215        dis_int(INTNO_MMC_RSPI_SPRI);
     
    745745        else            /* Socket empty */
    746746                s |= (STA_NODISK | STA_NOINIT);
    747         Stat = s;
     747
     748        if (Stat != s) {
     749                mmc_rspi_status_changed(s);
     750                Stat = s;
     751        }
    748752}
    749753
  • asp3_tinet_ecnl_rx/trunk/ntshell/fatfs/mmc_rspi.h

    r337 r359  
    6767#endif
    6868
    69 extern void mmc_rspi_spri_handler(void);
    70 extern void mmc_rspi_spti_handler(void);
    71 extern void mmc_rspi_spii_handler(void);
    72 extern void mmc_rspi_cychdr(intptr_t exinf);
     69void mmc_rspi_spri_handler(void);
     70void mmc_rspi_spti_handler(void);
     71void mmc_rspi_spii_handler(void);
     72void mmc_rspi_cychdr(intptr_t exinf);
     73void mmc_rspi_status_changed(DSTATUS newst);
    7374
    7475#endif /* _MMC_RSPI_H_ */
Note: See TracChangeset for help on using the changeset viewer.