Changeset 441 for EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c
- Timestamp:
- Jul 10, 2020, 9:09:25 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c
r435 r441 42 42 #include <kernel.h> 43 43 #include <stdlib.h> 44 //#include <string.h>44 #include <string.h> 45 45 #include "t_stdlib.h" 46 46 #include "syssvc/serial.h" 47 47 #include "syssvc/syslog.h" 48 #include "target_syssvc.h" 48 49 #include "kernel_cfg.h" 49 50 #include "diskio.h" 50 51 #include "sdfs.h" 51 52 #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" 54 56 55 57 #define SD_CARD_LOG_LEVEL LOG_INFO 56 58 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]; 59 enum ffarch_state_t { 60 FFS_IDLE, 61 FFS_RETRY_WAIT, 62 }; 63 64 enum ffarch_state_t ffarch_state; 65 volatile int ffarch_timer; 66 int ffarch_retry_count; 67 uint8_t sdfs_new_status, sdfs_prev_status; 68 69 static void ffarch_initialize(); 70 71 /* 72 * FatFSタスク 73 */ 74 void 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 64 119 FATFS RomDisk; 65 120 … … 75 130 SD Sd; 76 131 77 void sys_init(void);78 132 bool_t romdisk_init(); 79 133 bool_t SD_begin(); 80 134 81 int mruby_arduino_init() 82 { 83 int result = -1; 84 85 sys_init(); 86 135 void ffarch_init(void) 136 { 87 137 /* SD_CD */ 88 138 gpio_init_in(&ins, P7_8); … … 91 141 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd"); 92 142 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!"); 96 155 } 97 156 else { 98 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n"); 99 } 157 syslog(LOG_NOTICE, "ROM disk (0:) NG!"); 158 } 159 } 160 161 void ffarch_initialize() 162 { 100 163 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);154 164 } 155 165 … … 219 229 return ramdisk_get_status(); 220 230 case 1: 221 return sdfs _status(&sdfs);231 return sdfs._is_initialized; 222 232 } 223 233 return STA_NOINIT; … … 246 256 } 247 257 258 DRESULT sdfs_ioctl(BYTE ctrl, void *buff); 259 248 260 DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) 249 261 { … … 252 264 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */ 253 265 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); 263 267 } 264 268 return RES_PARERR; 265 269 } 266 270 271 DRESULT 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 267 332 void sdfs_cychdr(intptr_t exinf) 268 333 { 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()) 273 338 s |= STA_PROTECT; 274 else /* Write enabled */339 else 275 340 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 277 346 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 356 int ffarch_get_timer(void) 357 { 358 return ffarch_timer; 359 } 360 361 void 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 371 void 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 } 281 428 } 282 429 … … 314 461 void* ff_memalloc (UINT msize) 315 462 { 316 return sys_malloc(msize);463 return malloc(msize); 317 464 } 318 465 319 466 void ff_memfree (void* mblock) 320 467 { 321 sys_free(mblock);468 free(mblock); 322 469 } 323 470
Note:
See TracChangeset
for help on using the changeset viewer.