Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SDカードとのアクセス(FAT32について)

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 SDカードとのアクセス(FAT32について)

Avatar for BruCandy

BruCandy

May 20, 2025
Tweet

More Decks by BruCandy

Other Decks in Programming

Transcript

  1. FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域

    Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1 パーティションは 四つまで定義可能 今回は パーティション1の みを使用
  2. MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは

    ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus  →1クラスタ何セクタか ・BPB_RsvdSecCnt  →① ・BPB_FATSz32  →② ・BPB_RootClus  →ルートディレクトリの先頭クラスタ番号
  3. BPB FAT1 FAT2 ユーザー領域 PT_LbaOfs + ① + 2×② クラスタ

    0 クラスタ 1 クラスタ 2 BPB_RootClus ディレクトリエントリー ・ファイル名 ・位置         etc
  4. MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは

    ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus  →1クラスタ何セクタか ・BPB_RsvdSecCnt  →① ・BPB_FATSz32  →② ・BPB_RootClus  →ルートディレクトリの先頭クラスタ番号
  5. MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは

    ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus  →1クラスタ何セクタか ・BPB_RsvdSecCnt  →① ・BPB_FATSz32  →② ・BPB_RootClus  →ルートディレクトリの先頭クラスタ番号
  6. FAT32について(ディレクトリエントリー) ここまでの情報でユーザ領域の先頭セクタ番号が求まる  → PT_LbaOfs + BPB_RsvdSecCnt + 2 × BPB_FATSz32  次に、目標のファイルのクラスタ番号を求める必要がある。 

     → その情報を管理するのがディレクトリエントリー ディレクトリエントリーにはファイルの名前やそのファイルの先頭クラスタ番号が保存されている。 SDカード内にあるファイルはそれぞれディレクトリエントリー(32バイト)を1つ持っており、そのディ レクトリエントリーにあるファイル名を参考に、目標ファイルのディレクトリエントリーを探し出す。 見つけることができたら、そのディレクトリエントリーから目標ファイルのクラスタ番号を読みだす。 ① ②
  7. BPB FAT1 FAT2 ユーザー領域 PT_LbaOfs + ① + 2×② クラスタ

    0 クラスタ 1 クラスタ 2 BPB_RootClus ディレクトリエントリー  ・ファイル名  ・位置       etc
  8. 手順(SDHCのみ) 1. 低速クロックでスタート 2. ダミークロックを流す → コマンドを受け付ける準備を完了 3. CMD0 → ソフトウェアリセット 4. CMD8 → 動作電圧確認(必要) 5.

    ACMD41(CMD55 CMD41) → 初期化 6. 高速クロックに切り替え 7. CMD17でセクタを読み出す。 → 引数にセクタ番号を指定する。 CMD17を使って、PT_LbaOfsやBPB_RootClusなどを読みだして、その値をも とに目標ファイルの先頭セクタ番号を求める。そして、その番号をCMD17の引数に 渡すことで、データを取り出すことができる。 (あらかじめ、目標ファイルの先頭セクタ番号がわかっていたら、PT_LbaOfsやBPB_RootClusなどを読みだす必要なし)