Ignore:
Timestamp:
Jul 10, 2020, 9:09:25 PM (4 years ago)
Author:
coas-nagasima
Message:

NTShellタスクを更新

File:
1 edited

Legend:

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

    r435 r441  
    4242#include <kernel.h>
    4343#include <stdlib.h>
    44 //#include <string.h>
     44#include <string.h>
    4545#include "t_stdlib.h"
    4646#include "syssvc/serial.h"
    4747#include "syssvc/syslog.h"
     48#include "target_syssvc.h"
    4849#include "kernel_cfg.h"
    4950#include "diskio.h"
    5051#include "sdfs.h"
    5152#include "ff.h"
    52 #include "tlsf.h"
    53 #include "util/ntstdio.h"
     53#include <stdio.h>
     54#include "hal/rtc_api.h"
     55#include "ffarch.h"
    5456
    5557#define SD_CARD_LOG_LEVEL LOG_INFO
    5658
    57 #define SIO_PORTID 1
    58 extern ntstdio_t ntstdio;
    59 
    60 static tlsf_t sys_tlsf;
    61 static pool_t sys_pool;
    62 
    63 uint8_t shell_heap[64 * 1024];
     59enum ffarch_state_t {
     60        FFS_IDLE,
     61        FFS_RETRY_WAIT,
     62};
     63
     64enum ffarch_state_t ffarch_state;
     65volatile int ffarch_timer;
     66int ffarch_retry_count;
     67uint8_t sdfs_new_status, sdfs_prev_status;
     68
     69static void ffarch_initialize();
     70
     71/*
     72 * FatFSタスク
     73 */
     74void ffarch_task(intptr_t exinf)
     75{
     76        ER ret, ret2;
     77        SYSTIM prev, now;
     78        int timer;
     79
     80        ffarch_initialize();
     81
     82        ret2 = get_tim(&now);
     83        if (ret2 != E_OK){
     84                syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
     85                        itron_strerror(ret2));
     86                return;
     87        }
     88
     89        for(;;){
     90                prev = now;
     91
     92                /* タイマー取得 */
     93                timer = ffarch_get_timer();
     94
     95                /* 待ち */
     96                ret = tslp_tsk(timer);
     97                if ((ret != E_OK) && (ret != E_TMOUT)) {
     98                        syslog(LOG_NOTICE, "[ffarch] tslp_tsk error: %s %d",
     99                                itron_strerror(ret), timer);
     100                        break;
     101                }
     102
     103                ret2 = get_tim(&now);
     104                if (ret2 != E_OK) {
     105                        syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
     106                                itron_strerror(ret2));
     107                        break;
     108                }
     109
     110                /* 時間経過 */
     111                int elapse = now - prev;
     112                ffarch_progress(elapse);
     113
     114                /* タイムアウト処理 */
     115                ffarch_timeout();
     116        }
     117}
     118
    64119FATFS RomDisk;
    65120
     
    75130SD Sd;
    76131
    77 void sys_init(void);
    78132bool_t romdisk_init();
    79133bool_t SD_begin();
    80134
    81 int mruby_arduino_init()
    82 {
    83         int result = -1;
    84 
    85         sys_init();
    86 
     135void ffarch_init(void)
     136{
    87137        /* SD_CD */
    88138        gpio_init_in(&ins, P7_8);
     
    91141        sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
    92142
    93         result = SD_begin() ? 0 : -1;
    94         if (result == 0) {
    95                 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
     143        ffarch_state = FFS_IDLE;
     144        ffarch_timer = 0;
     145        ffarch_retry_count = 3;
     146        sdfs_new_status = 0;
     147        sdfs_prev_status = STA_NODISK;
     148
     149        ffarch_timeout();
     150
     151        act_tsk(FFARCH_TASK);
     152
     153        if (romdisk_init()) {
     154                syslog(LOG_NOTICE, "ROM disk (0:) OK!");
    96155        }
    97156        else {
    98                 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
    99         }
     157                syslog(LOG_NOTICE, "ROM disk (0:) NG!");
     158        }
     159}
     160
     161void ffarch_initialize()
     162{
    100163        sta_cyc(SDFS_CYC);
    101 
    102         if (romdisk_init())
    103                 result = 0;
    104 
    105         if (result == 0) {
    106                 ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
    107         }
    108         else {
    109                 ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
    110         }
    111 
    112         /* uploadディレクトリを作成しておく */
    113         f_mkdir("1:/upload");
    114 
    115         serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
    116 
    117         return result;
    118 }
    119 
    120 void sys_init(void)
    121 {
    122         sys_tlsf = tlsf_create(&shell_heap);
    123         if (sys_tlsf == NULL)
    124                 return;
    125 
    126         sys_pool = tlsf_add_pool(sys_tlsf, ((uint8_t *)&shell_heap) + tlsf_size(), sizeof(shell_heap) - tlsf_size());
    127 }
    128 
    129 void sys_fini(void)
    130 {
    131         tlsf_destroy(sys_tlsf);
    132 }
    133 
    134 void *sys_malloc(size_t size)
    135 {
    136         return tlsf_malloc(sys_tlsf, size);
    137 }
    138 
    139 void *sys_calloc(size_t size, size_t count)
    140 {
    141         void *result = tlsf_malloc(sys_tlsf, count * size);
    142         memset(result, 0, count * size);
    143         return result;
    144 }
    145 
    146 void *sys_realloc(void *ptr, size_t size)
    147 {
    148         return tlsf_realloc(sys_tlsf, ptr, size);
    149 }
    150 
    151 void sys_free(void *ptr)
    152 {
    153         tlsf_free(sys_tlsf, ptr);
    154164}
    155165
     
    219229                return ramdisk_get_status();
    220230        case 1:
    221                 return sdfs_status(&sdfs);
     231                return sdfs._is_initialized;
    222232        }
    223233        return STA_NOINIT;
     
    246256}
    247257
     258DRESULT sdfs_ioctl(BYTE ctrl, void *buff);
     259
    248260DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
    249261{
     
    252264                return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
    253265        case 1:
    254                 switch(cmd) {
    255                 case CTRL_SYNC:
    256                         return sdfs_sync(&sdfs);
    257                 case GET_SECTOR_COUNT:
    258                         return sdfs_sectors(&sdfs);
    259                 case GET_BLOCK_SIZE:
    260                         *((DWORD*)buff) = 1; // default when not known
    261                         return RES_OK;
    262                 }
     266                return sdfs_ioctl(cmd, buff);
    263267        }
    264268        return RES_PARERR;
    265269}
    266270
     271DRESULT sdfs_ioctl(BYTE ctrl, void *buff)
     272{
     273        DRESULT res;
     274        uint32_t *dp = (uint32_t *)buff;
     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
    267332void sdfs_cychdr(intptr_t exinf)
    268333{
    269         BYTE s;
    270 
    271         s = sdfs._is_initialized;
    272         if (WP())               /* Write protected */
     334        BYTE s = 0;
     335             
     336        /* Write protected */
     337        if (WP())
    273338                s |= STA_PROTECT;
    274         else            /* Write enabled */
     339        else
    275340                s &= ~STA_PROTECT;
    276         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
    277346                s &= ~STA_NODISK;
    278         else            /* Socket empty */
    279                 s |= (STA_NODISK | STA_NOINIT);
    280         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(void)
     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(void)
     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                        syslog(SD_CARD_LOG_LEVEL, "SD card (1:) initialize tired...");
     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                        syslog(SD_CARD_LOG_LEVEL, "SD card initializing ...");
     393
     394                        if (SD_begin()) {
     395                                syslog(SD_CARD_LOG_LEVEL, "SD card (1:) OK!");
     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                                syslog(SD_CARD_LOG_LEVEL, "SD card (1:) NG!");
     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                        syslog(SD_CARD_LOG_LEVEL, "SD card unmount");
     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        }
    281428}
    282429
     
    314461void* ff_memalloc (UINT msize)
    315462{
    316         return sys_malloc(msize);
     463        return malloc(msize);
    317464}
    318465
    319466void ff_memfree (void* mblock)
    320467{
    321         sys_free(mblock);
     468        free(mblock);
    322469}
    323470
Note: See TracChangeset for help on using the changeset viewer.