Changeset 435
- Timestamp:
- Jul 5, 2020, 10:49:56 PM (3 years ago)
- Location:
- EcnlProtoTool/trunk/ntshell
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/fatfs/ff.c
r434 r435 17 17 18 18 19 #include "shellif.h" 19 20 #include "ff.h" /* Declarations of FatFs API */ 20 21 #include "diskio.h" /* Declarations of disk I/O functions */ 21 22 #include "util/ntstdio.h" 22 #include "shellif.h"23 23 24 24 /*-------------------------------------------------------------------------- … … 2617 2617 /* Get logical drive number */ 2618 2618 #if !FF_FS_READONLY 2619 mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW ;2619 mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW | FA_OPEN_APPEND; 2620 2620 res = find_volume(&dj.fs, &path, (BYTE)(mode & ~FA_READ)); 2621 2621 #else -
EcnlProtoTool/trunk/ntshell/fatfs/ff.h
r434 r435 309 309 #define FA_CREATE_ALWAYS 0x08 310 310 #define FA_OPEN_ALWAYS 0x10 311 #define FA_OPEN_APPEND 0x30 311 312 #define FA_MODIFIED 0x20 312 313 #define FA_DIRTY 0x40 -
EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c
r434 r435 53 53 #include "util/ntstdio.h" 54 54 55 #define SD_CARD_LOG_LEVEL LOG_INFO 56 55 57 #define SIO_PORTID 1 56 58 extern ntstdio_t ntstdio; … … 279 281 } 280 282 283 void sdfs_debug(const char *fmt, ...) 284 { 285 va_list arp; 286 287 va_start(arp, fmt); 288 syslog(SD_CARD_LOG_LEVEL, fmt, arp); 289 va_end(arp); 290 } 291 281 292 int ff_cre_syncobj(BYTE vol, FF_SYNC_t* sobj) 282 293 { … … 310 321 sys_free(mblock); 311 322 } 323 324 DWORD get_fattime(void) 325 { 326 time_t temp; 327 struct tm _tm; 328 329 temp = rtc_read(); 330 gmtime_r(&temp, &_tm); 331 332 return ((DWORD)(_tm.tm_year - 1980) << 25) 333 | ((DWORD)_tm.tm_mon << 21) 334 | ((DWORD)_tm.tm_mday << 16) 335 | ((DWORD)_tm.tm_hour << 11) 336 | ((DWORD)_tm.tm_min << 5) 337 | ((DWORD)_tm.tm_sec >> 1); 338 } -
EcnlProtoTool/trunk/ntshell/fatfs/ffconf.h
r434 r435 4 4 5 5 #define FFCONF_DEF 64180 /* Revision ID */ 6 7 #define FFS_DBG 0 6 8 7 9 /*---------------------------------------------------------------------------/ … … 125 127 126 128 129 #define FF_LFN_BUF 255 130 #define FF_SFN_BUF 12 131 /* This set of options defines size of file name members in the FILINFO structure 132 / which is used to read out directory items. These values should be suffcient for 133 / the file names to read. The maximum possible length of the read file name depends 134 / on character encoding. When LFN is not enabled, these options have no effect. */ 135 136 127 137 #define FF_FS_RPATH 2 128 138 /* This option configures relative path feature. -
EcnlProtoTool/trunk/ntshell/fatfs/fftime.c
r331 r435 254 254 return -1; 255 255 } 256 257 DWORD get_fattime(void)258 {259 time_t temp;260 struct tm _tm;261 262 temp = rtc_read();263 gmtime_r(&temp, &_tm);264 265 return ((DWORD)(_tm.tm_year - 1980) << 25)266 | ((DWORD)_tm.tm_mon << 21)267 | ((DWORD)_tm.tm_mday << 16)268 | ((DWORD)_tm.tm_hour << 11)269 | ((DWORD)_tm.tm_min << 5)270 | ((DWORD)_tm.tm_sec >> 1);271 } -
EcnlProtoTool/trunk/ntshell/fatfs/sdfs.c
r429 r435 115 115 */ 116 116 #include "sdfs.h" 117 #include "diskio.h" 117 118 //#include "mbed_debug.h" 118 119 #include "mbed_wait_api.h" 119 120 #define debug(str, ...) 121 #define debug_if(cond, strt, ...) if(cond){ debug(str, __ARGS__); } 120 #include "util/ntstdio.h" 121 122 void sdfs_debug(const char *fmt, ...); 123 #define debug(...) sdfs_debug(__VA_ARGS__) 124 #define debug_if(cond, ...) if (cond) { sdfs_debug(__VA_ARGS__); } 122 125 123 126 static int sdfs_initialise_card_v1(sdfs_t *obj); … … 134 137 #define SD_DBG 0 135 138 136 sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)139 void sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) 137 140 { 138 141 obj->name = name; … … 144 147 obj->_init_sck = 100000; 145 148 obj->_transfer_sck = 1000000; 149 obj->_is_initialized = STA_NOINIT; 146 150 } 147 151 … … 154 158 #define R1_PARAMETER_ERROR (1 << 6) 155 159 156 // Types157 #define SDCARD_FAIL 0 //!< v1.x Standard Capacity158 #define SDCARD_V1 1 //!< v2.x Standard Capacity159 #define SDCARD_V2 2 //!< v2.x High Capacity160 #define SDCARD_V2HC 3 //!< Not recognised as an SD Card161 162 160 int sdfs_initialise_card(sdfs_t *obj) 163 161 { … … 173 171 if (sdfs__cmd(obj, 0, 0) != R1_IDLE_STATE) { 174 172 debug("No disk, or could not put SD card in to SPI idle state\n"); 175 return SDCARD_FAIL;173 return CT_FAIL; 176 174 } 177 175 … … 186 184 else { 187 185 debug("Not in idle state after sending CMD8 (not an SD card?)\n"); 188 return SDCARD_FAIL;186 return CT_FAIL; 189 187 } 190 188 } … … 192 190 static int sdfs_initialise_card_v1(sdfs_t *obj) 193 191 { 192 sdfs__cmd(obj, 55, 0); 193 if (sdfs__cmd(obj, 41, 0) <= 1) { 194 obj->cdv = 512; 195 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); 196 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 197 sdfs__cmd(obj, 55, 0); 198 if (sdfs__cmd(obj, 41, 0) == 0) { 199 break; 200 } 201 } 202 return CT_SD1; 203 } 204 else { 205 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 206 if (sdfs__cmd(obj, 1, 0) == 0) 207 break; 208 } 209 return CT_MMC; 210 } 211 //if (!Timer1 || sdfs__cmd(obj, 16, 512) != 0) /* Set block length: 512 */ 212 // ty = 0; 213 214 debug("Timeout waiting for v1.x card\n"); 215 return CT_FAIL; 216 } 217 218 static int sdfs_initialise_card_v2(sdfs_t *obj) 219 { 220 int n; 221 uint8_t ocr[4]; 222 223 /* Get 32 bit return value of R7 resp */ 224 for (n = 0; n < 4; n++) ocr[n] = spi_master_write(&obj->_spi, 0xFF); 194 225 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 195 226 sdfs__cmd(obj, 55, 0); 196 if (sdfs__cmd(obj, 41, 0) == 0) { 197 obj->cdv = 512; 198 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); 199 return SDCARD_V1; 200 } 201 } 202 203 debug("Timeout waiting for v1.x card\n"); 204 return SDCARD_FAIL; 205 } 206 207 static int sdfs_initialise_card_v2(sdfs_t *obj) 208 { 209 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 227 if (sdfs__cmd(obj, 41, 0x40000000) == 0) { 228 if (sdfs__cmd58(obj) == 0) { 229 for (n = 0; n < 4; n++) ocr[n] = spi_master_write(&obj->_spi, 0xFF); 230 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); 231 obj->cdv = 1; 232 return (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; 233 } 234 } 210 235 wait_ms(50); 211 sdfs__cmd58(obj);212 sdfs__cmd(obj, 55, 0);213 if (sdfs__cmd(obj, 41, 0x40000000) == 0) {214 sdfs__cmd58(obj);215 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");216 obj->cdv = 1;217 return SDCARD_V2;218 }219 236 } 220 237 221 238 debug("Timeout waiting for v2.x card\n"); 222 return SDCARD_FAIL;239 return CT_FAIL; 223 240 } 224 241 225 242 int sdfs_initialize(sdfs_t *obj) 226 243 { 227 obj->_is_initialized = sdfs_initialise_card(obj); 228 if (obj->_is_initialized == 0) { 244 obj->_is_initialized |= STA_NOINIT; 245 246 obj->_card_type = sdfs_initialise_card(obj); 247 if (obj->_card_type == 0) { 229 248 debug("Fail to initialize card\n"); 230 249 return 1; 231 250 } 232 debug_if(SD_DBG, "init card = %d\n", obj->_is_initialized); 251 debug_if(SD_DBG, "init card = %x\n", obj->_is_initialized); 252 233 253 obj->_sectors = sdfs__sd_sectors(obj); 254 255 if (sdfs__cmdx(obj, 10, 0) != 0 /* READ_CID */ 256 || sdfs__read(obj, obj->_cid, 16) != 0) { 257 obj->_card_type = CT_FAIL; 258 debug("Fail to read cid\n"); 259 return 1; 260 } 234 261 235 262 // Set block length to 512 (CMD16) 236 263 if (sdfs__cmd(obj, 16, 512) != 0) { 264 obj->_card_type = CT_FAIL; 237 265 debug("Set 512-byte block timed out\n"); 238 266 return 1; 239 267 } 268 269 obj->_is_initialized &= ~STA_NOINIT; 240 270 241 271 // Set SCK for data transfer … … 246 276 int sdfs_write(sdfs_t *obj, const uint8_t *buffer, uint32_t block_number, uint32_t count) 247 277 { 248 if ( !obj->_is_initialized) {278 if (obj->_is_initialized & (STA_NOINIT | STA_PROTECT)) { 249 279 return -1; 250 280 } … … 266 296 int sdfs_read(sdfs_t *obj, uint8_t *buffer, uint32_t block_number, uint32_t count) 267 297 { 268 if ( !obj->_is_initialized) {298 if (obj->_is_initialized & STA_NOINIT) { 269 299 return -1; 270 300 } … … 287 317 { 288 318 // FATFileSystem::disk_status() returns 0 when initialized 289 if ( obj->_is_initialized) {319 if ((obj->_is_initialized & STA_NOINIT) == 0) { 290 320 return 0; 291 321 } … … 294 324 } 295 325 } 296 int sdfs_sync(sdfs_t *obj) { return 0; } 326 297 327 uint64_t sdfs_sectors(sdfs_t *obj) { return obj->_sectors; } 298 328 … … 477 507 { 478 508 uint32_t c_size, c_size_mult, read_bl_len; 479 uint32_t block_len, mult, blocknr, capacity;509 uint32_t mult, blocknr; 480 510 uint32_t hc_c_size; 481 511 uint64_t blocks; … … 487 517 } 488 518 489 uint8_t csd[16]; 490 if (sdfs__read(obj, csd, 16) != 0) { 519 if (sdfs__read(obj, obj->_csd, 16) != 0) { 491 520 debug("Couldn't read csd response from disk\n"); 492 521 return 0; … … 498 527 // read_bl_len : csd[83:80] - the *maximum* read block length 499 528 500 int csd_structure = sdfs_ext_bits(obj, csd, 127, 126);529 int csd_structure = sdfs_ext_bits(obj, obj->_csd, 127, 126); 501 530 502 531 switch (csd_structure) { 503 532 case 0: 504 533 obj->cdv = 512; 505 c_size = sdfs_ext_bits(obj, csd, 73, 62);506 c_size_mult = sdfs_ext_bits(obj, csd, 49, 47);507 read_bl_len = sdfs_ext_bits(obj, csd, 83, 80);508 509 block_len = 1 << read_bl_len;534 c_size = sdfs_ext_bits(obj, obj->_csd, 73, 62); 535 c_size_mult = sdfs_ext_bits(obj, obj->_csd, 49, 47); 536 read_bl_len = sdfs_ext_bits(obj, obj->_csd, 83, 80); 537 538 obj->_block_len = 1 << read_bl_len; 510 539 mult = 1 << (c_size_mult + 2); 511 540 blocknr = (c_size + 1) * mult; 512 capacity = blocknr *block_len;513 blocks = capacity / 512;514 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);541 obj->_capacity = blocknr * obj->_block_len; 542 blocks = obj->_capacity / 512; 543 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, obj->_capacity, blocks); 515 544 break; 516 545 517 546 case 1: 518 547 obj->cdv = 1; 519 hc_c_size = sdfs_ext_bits(obj, csd, 63, 48);548 hc_c_size = sdfs_ext_bits(obj, obj->_csd, 63, 48); 520 549 blocks = (hc_c_size + 1) * 1024; 521 550 debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks * 512, blocks); … … 528 557 return blocks; 529 558 } 559 560 static 561 int wait_ready(sdfs_t *obj, uint32_t wt) 562 { 563 /* Wait until card goes ready or timeout */ 564 for (int i = 0; i < wt; i++) { 565 if (spi_master_write(&obj->_spi, 0xFF) == 0xFF) 566 /* Card goes ready */ 567 return 1; 568 } 569 570 /* Timeout occured */ 571 return 0; 572 } 573 574 static 575 void deselect(sdfs_t *obj) 576 { 577 /* Set CS# high */ 578 gpio_write(&obj->_cs, 0); 579 580 /* Dummy clock (force DO hi-z for multiple slave SPI) */ 581 spi_master_write(&obj->_spi, 0xFF); 582 } 583 584 static 585 int select(sdfs_t *obj) 586 { 587 /* Set CS# low */ 588 gpio_write(&obj->_cs, 1); 589 590 /* Dummy clock (force DO enabled) */ 591 spi_master_write(&obj->_spi, 0xFF); 592 593 /* Wait for card ready */ 594 if (wait_ready(obj, 500)) 595 return 0; 596 597 deselect(obj); 598 599 /* Failed to select the card due to timeout */ 600 return -1; 601 } 602 603 int sdfs_sync(sdfs_t *obj) 604 { 605 int ret = select(obj); 606 deselect(obj); 607 return ret; 608 } 609 610 int sdfs_trim(sdfs_t *obj, uint32_t st, uint32_t ed) 611 { 612 int res = -1; 613 614 for(;;) { 615 /* Check if the card is SDC */ 616 if (!(obj->_card_type & CT_SDC)) 617 break; 618 /* Check if sector erase can be applied to the card */ 619 if (!(obj->_csd[0] >> 6) && !(obj->_csd[10] & 0x40)) 620 break; 621 /* Load sector block */ 622 if (!(obj->_card_type & CT_BLOCK)) { 623 st *= 512; ed *= 512; 624 } 625 /* Erase sector block */ 626 if ((sdfs__cmd(obj, 32, st) == 0) 627 && (sdfs__cmd(obj, 33, ed) == 0) 628 && (sdfs__cmd(obj, 38, 0) == 0) 629 && wait_ready(obj, 30000)) 630 res = 0; 631 } 632 633 return res; 634 } 635 636 int sdfs_get_ocr(sdfs_t *obj, uint8_t buff[4]) 637 { 638 int res = -1, n; 639 640 /* READ_OCR */ 641 if (sdfs__cmd58(obj) == 0) { 642 for (n = 4; n; n--) { 643 *buff++ = spi_master_write(&obj->_spi, 0xFF); 644 } 645 res = 0; 646 } 647 648 deselect(obj); 649 650 return res; 651 } 652 653 int sdfs_get_sdstat(sdfs_t *obj, uint8_t buff[64]) 654 { 655 int res = -1; 656 657 sdfs__cmd(obj, 55, 0); 658 659 /* SD_STATUS */ 660 if (sdfs__cmd(obj, 13, 0) == 0) { 661 spi_master_write(&obj->_spi, 0xFF); 662 if (sdfs__read(obj, buff, 64) == 0) 663 return 0; 664 } 665 666 deselect(obj); 667 668 return res; 669 } -
EcnlProtoTool/trunk/ntshell/fatfs/sdfs.h
r331 r435 34 34 #endif 35 35 36 /* MMC card type flags (MMC_GET_TYPE) */ 37 #define CT_FAIL 0x00 38 #define CT_MMC 0x01 /* MMC ver 3 */ 39 #define CT_SD1 0x02 /* SD ver 1 */ 40 #define CT_SD2 0x04 /* SD ver 2 */ 41 #define CT_SDC (CT_SD1|CT_SD2) /* SD */ 42 #define CT_BLOCK 0x08 /* Block addressing */ 43 36 44 /** Access the filesystem on an SD Card using SPI 37 45 * … … 51 59 typedef struct sdfs_s{ 52 60 const char* name; 61 volatile uint8_t _is_initialized; 62 uint8_t _card_type; 63 uint8_t _csd[16], _cid[16]; 64 uint64_t _capacity; 65 uint64_t _block_len; 53 66 uint64_t _sectors; 54 67 spi_t _spi; … … 57 70 uint32_t _init_sck; 58 71 uint32_t _transfer_sck; 59 int _is_initialized;60 72 } sdfs_t; 61 73 … … 68 80 * @param name The name used to access the virtual filesystem 69 81 */ 70 sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);82 void sdfs_init(sdfs_t *obj, PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name); 71 83 72 84 int sdfs_initialize(sdfs_t *obj); … … 76 88 int sdfs_sync(sdfs_t *obj); 77 89 uint64_t sdfs_sectors(sdfs_t *obj); 90 int sdfs_trim(sdfs_t *obj, uint32_t st, uint32_t ed); 91 int sdfs_get_ocr(sdfs_t *obj, uint8_t buff[4]); 92 int sdfs_get_sdstat(sdfs_t *obj, uint8_t buff[64]); 78 93 79 94 #ifdef __cplusplus -
EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.c
r434 r435 330 330 331 331 while ((res == FR_OK) && (fno.fname[0] != 0)) { 332 if (pattern_p != NULL && (fno.fattrib & AM_DIR) && ((fno.fname[0] == '.') ? (pattern_p[0] == '.') : 1)) {/* FATFS_DIR とパターンマッチしている場合は FATFS_DIR 内部を ls する */332 if (pattern_p != NULL && (fno.fattrib & AM_DIR) && ((fno.fname[0] == '.') ? (pattern_p[0] == '.') : 1)) {/* DIR とパターンマッチしている場合は DIR 内部を ls する */ 333 333 #if FF_USE_LFN 334 334 fn = *fno.lfname ? fno.lfname : fno.fname; … … 374 374 f_closedir(&dir); 375 375 376 #if FF_USE_LFN 376 377 if (lfn != NULL) ff_memfree(lfn); 378 #endif 377 379 if (path_backup != NULL) ff_memfree(path_backup); 378 380 } -
EcnlProtoTool/trunk/ntshell/src/main.h
r433 r435 1 1 /* 2 * TOPPERS ECHONET Lite Communication Middleware2 * TOPPERS PROJECT Home Network Working Group Software 3 3 * 4 * Copyright (C) 2014-201 7Cores Co., Ltd. Japan4 * Copyright (C) 2014-2019 Cores Co., Ltd. Japan 5 5 * 6 6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
Note:
See TracChangeset
for help on using the changeset viewer.