Changeset 359 for asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/sdfs.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/sdfs.c
r352 r359 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 extern ntstdio_t ntstdio; 123 #define debug(...) ntstdio_printf(&ntstdio, __VA_ARGS__) 124 #define debug_if(cond, ...) if(cond){ ntstdio_printf(&ntstdio, __VA_ARGS__); } 122 125 123 126 static int sdfs_initialise_card_v1(sdfs_t *obj); … … 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 }
Note:
See TracChangeset
for help on using the changeset viewer.