|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
-
-
- #if defined(__arm__)
- #include "SD_t3.h"
- #ifdef USE_TEENSY3_OPTIMIZED_CODE
-
- uint8_t SDClass::fat_type;
- uint32_t SDClass::fat1_begin_lba;
- uint32_t SDClass::fat2_begin_lba;
- uint32_t SDClass::data_begin_lba;
- uint32_t SDClass::max_cluster;
- uint8_t SDClass::sector2cluster;
- File SDClass::rootDir;
-
- static uint32_t unaligned_read32_align16(const void *p)
- {
- #ifdef KINETISK
- return *(const uint32_t *)p;
- #else
- return *(const uint16_t *)p | (*(const uint16_t *)(p+1) << 16);
- #endif
- }
-
- static uint32_t unaligned_read16_align8(const void *p)
- {
- #ifdef KINETISK
- return *(const uint16_t *)p;
- #else
- return *(const uint8_t *)p | (*(const uint8_t *)(p+1) << 8);
- #endif
- }
-
- #define BPB_BytsPerSec 11
- #define BPB_SecPerClus 13
- #define BPB_NumFATs 16
- #define BPB_RootEntCnt 17
- #define BPB_TotSec16 19
- #define BPB_FATSz16 22
- #define BPB_TotSec32 32
- #define BPB_FATSz32 36
- #define BPB_RootClus 44
-
- bool SDClass::begin(uint8_t csPin)
- {
- uint8_t status;
- uint32_t cond, hcs, ocr;
-
-
- csreg = PIN_TO_BASEREG(csPin);
- csmask = PIN_TO_BITMASK(csPin);
- pinMode(csPin, OUTPUT);
- DIRECT_WRITE_HIGH(csreg, csmask);
- SPI.begin();
-
- SPI.beginTransaction(SD_SPI_SPEED);
- for (uint8_t i=0; i < 5; i++) SPI.transfer16(0xFFFF);
-
- elapsedMillis msec = 0;
- while (1) {
- status = sd_cmd0();
-
-
- if (status == 1) break;
- SPI.endTransaction();
- if (msec > 250) return false;
- SPI.beginTransaction(SD_SPI_SPEED);
- }
-
- cond = sd_cmd8();
- if (cond == 0x80000000) {
-
- card_type = 1;
- hcs = 0;
- } else if (cond == 0x1AA) {
-
- card_type = 2;
- hcs = (1<<30);
- } else {
- SPI.endTransaction();
- return false;
- }
-
-
- msec = 0;
- while (1) {
- status = sd_acmd41(hcs);
-
- if (status == 0) break;
- SPI.endTransaction();
- if (status > 1) return false;
- if (msec > 1500) return false;
- SPI.beginTransaction(SD_SPI_SPEED);
- }
-
-
- if (card_type == 2) {
- ocr = sd_cmd58();
-
-
- if ((ocr >> 30) == 3) card_type = 3;
- }
- SPI.endTransaction();
-
-
- SDCache s;
- sector_t * mbr = s.read(0);
-
- if (mbr->u16[255] != 0xAA55) return false;
- uint32_t partition_lba = 0;
- uint32_t index = 446;
- do {
- uint8_t type = mbr->u8[index+4];
-
- if (type == 6 || type == 11 || type == 12) {
- partition_lba = unaligned_read32_align16(mbr->u8 + index + 8);
-
- break;
- }
- index += 16;
- } while (index < 64);
- s.release();
-
-
- sector_t *vol = s.read(partition_lba);
- if (vol->u16[255] != 0xAA55) return false;
-
- if (unaligned_read16_align8(vol->u8 + BPB_BytsPerSec) != 512) return false;
-
- if (vol->u8[BPB_NumFATs] != 2) return false;
- uint32_t reserved_sectors = vol->u16[14/2];
- if (reserved_sectors == 0) return false;
-
- uint32_t sectors_per_cluster = vol->u8[BPB_SecPerClus];
-
- uint32_t s2c = 31 - __builtin_clz(sectors_per_cluster);
-
- sector2cluster = s2c;
- uint32_t sectors_per_fat = vol->u16[BPB_FATSz16/2];
- if (sectors_per_fat == 0) sectors_per_fat = vol->u32[BPB_FATSz32/4];
-
- uint32_t root_dir_entries = unaligned_read16_align8(vol->u8 + BPB_RootEntCnt);
-
- uint32_t root_dir_sectors = (root_dir_entries + 15) >> 4;
-
-
- uint32_t total_sectors = unaligned_read16_align8(vol->u8 + BPB_TotSec16);
- if (total_sectors == 0) total_sectors = vol->u32[BPB_TotSec32/4];
-
-
- fat1_begin_lba = partition_lba + reserved_sectors;
- fat2_begin_lba = fat1_begin_lba + sectors_per_fat;
- data_begin_lba = fat2_begin_lba + sectors_per_fat + root_dir_sectors;
-
- uint32_t cluster_count = (total_sectors - reserved_sectors
- - root_dir_sectors - (sectors_per_fat << 1)) >> s2c;
-
- max_cluster = cluster_count + 1;
- if (cluster_count < 4085) {
- return false;
- } else if (cluster_count < 65525) {
- fat_type = 16;
- rootDir.length = root_dir_entries << 5;
- rootDir.start_cluster = partition_lba + reserved_sectors + sectors_per_fat * 2;
- rootDir.type = FILE_DIR_ROOT16;
- } else {
- fat_type = 32;
- rootDir.length = 0;
- rootDir.start_cluster = vol->u32[BPB_RootClus/4];
-
- rootDir.type = FILE_DIR;
- }
- rootDir.current_cluster = rootDir.start_cluster;
- rootDir.offset = 0;
- s.release();
-
- return true;
- }
-
- #endif
- #endif
|