Changeset 359 for asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/ffarch.c
- Timestamp:
- Jun 20, 2018, 7:59:22 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/ffarch.c
r352 r359 53 53 #include "util/ntstdio.h" 54 54 55 //extern ntstdio_t ntstdio; 55 extern ntstdio_t ntstdio; 56 57 enum ffarch_state_t { 58 FFS_IDLE, 59 FFS_RETRY_WAIT, 60 }; 61 62 enum ffarch_state_t ffarch_state; 63 volatile int ffarch_timer; 64 int ffarch_retry_count; 65 uint8_t sdfs_new_status, sdfs_prev_status; 66 67 static void ffarch_initialize(); 68 69 /* 70 * FatFSタスク 71 */ 72 void 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 } 56 116 57 117 FATFS RomDisk; … … 71 131 bool_t SD_begin(); 72 132 73 int ffarch_init() 74 { 75 int result = -1; 76 133 void ffarch_init() 134 { 77 135 /* SD_CD */ 78 136 gpio_init_in(&ins, P7_8); … … 81 139 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd"); 82 140 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"); 86 153 } 87 154 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 161 void ffarch_initialize() 162 { 90 163 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;108 164 } 109 165 … … 173 229 return ramdisk_get_status(); 174 230 case 1: 175 return sdfs _status(&sdfs);231 return sdfs._is_initialized; 176 232 } 177 233 return STA_NOINIT; … … 200 256 } 201 257 258 DRESULT sdfs_ioctl(BYTE ctrl, void *buff); 259 202 260 DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) 203 261 { … … 206 264 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */ 207 265 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); 217 267 } 218 268 return RES_PARERR; 219 269 } 220 270 271 DRESULT 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 221 332 void sdfs_cychdr(intptr_t exinf) 222 333 { 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()) 227 338 s |= STA_PROTECT; 228 else /* Write enabled */339 else 229 340 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 231 346 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 356 int ffarch_get_timer() 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() 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 } 235 428 } 236 429
Note:
See TracChangeset
for help on using the changeset viewer.