Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SDカードとのアクセス(FAT32について)
Search
BruCandy
May 20, 2025
Programming
61
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SDカードとのアクセス(FAT32について)
BruCandy
May 20, 2025
More Decks by BruCandy
See All by BruCandy
SSDモデルによる物体検出
brucandy
0
51
Other Decks in Programming
See All in Programming
ActionController meets Protocol Buffers
sorah
0
520
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
AWSに止められる覚悟してますか?
morizo_1984
2
540
Next.js: The final boss of Web Performance
guaca
0
260
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
660
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Typedesign – Prime Four
hannesfritz
42
3.2k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Building Adaptive Systems
keathley
44
3.2k
HDC tutorial
michielstock
2
960
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
The Cult of Friendly URLs
andyhume
79
7k
From π to Pie charts
rasagy
1
400
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
A Soul's Torment
seathinner
8
3.8k
Transcript
SDカードから色情報を読みだしたい! BruCandy
FPGAでSDカードの中にある情報を読み出したかった... 使用したもの ・Tang Nano 9K ・ラズパイピコ2 ・ILI9341搭載LCD(SPI通信対応) ・ブレッドボード、ジャンパワイヤなど配線類
きっかけ 春休み中に、LCDに画像を描画することに挑戦した。その結果、制限付きではあるが 成功した。 ・色が不正確 → 原因はわからない → 3色(白、黒、中間色)に絞って描画 ・画像サイズが(135×135px) → Gowin提供のIP Coreの制限による問題 とりあえず、画像サイズを大きく表示することを目指した → ・使用しているLCDにはSDカードのスロットがついている ・SDカードはSPI通信でアクセスできる ⇒ SDカードをROMとして扱う
今回の目標 SDカードに保存したファイルを読み出す。 ・あらかじめ、色情報(3バイト)を含んだファイルを一つだけSDカードに保存 ・読み取った色情報を使用して、その色の正方形をLCDに描画 (LCDへの描画方法の説明は省略) ⇒ ・ 3バイトのファイルが一つだけなので、 FATの操作をする必要がなくなる → 簡単に読み取ることができる!
FAT32について ・SDカードはSDHCの32GBを使用した。 ・フォーマットはFAT32で、SDカードから情報を読み出すにはFAT32の仕組みを ある程度理解する必要がある。 (ライブラリを使うならば、不要) FAT(File Allocation Table)32とは → ファイルシステムの一つ → FATにはFAT12、FAT16、FAT32、VFAT、exFATの5種類が存在する
FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域
Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1 パーティションは 四つまで定義可能 今回は パーティション1の みを使用
MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは
ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus →1クラスタ何セクタか ・BPB_RsvdSecCnt →① ・BPB_FATSz32 →② ・BPB_RootClus →ルートディレクトリの先頭クラスタ番号
BPB FAT1 FAT2 ユーザー領域 PT_LbaOfs + ① + 2×② クラスタ
0 クラスタ 1 クラスタ 2 BPB_RootClus ディレクトリエントリー ・ファイル名 ・位置 etc
クラスタ 6 ディレクトリエントリー ・ファイル名 ・位置 etc PT_LbaOfs + ① + 2×②
+ (6 - 2) × 4 CMD17の引数に指定 PT_LbaOfs + ① + 2×②
FAT32について(MBR) ・1セクタ = 512バイト (SDカードのCMD16で設定可能) ・セクタ単位でSDカードからデータを取り出す ・目標はユーザー領域内の読み出したいファイルがどこにあるか見つけること ・MBRは最初のセクタに存在し、512バイト ・MBRの中のパーティションテーブルに、それぞれのパーティションの位置と種類が 格納されている。 パーティション1へのアクセスのために開始セクタの番号を知る必要があるため、 パーティションテーブル1の「PT_LbaOfs」(454から4バイト)を読み出す。
FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域
Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1
MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは
ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus →1クラスタ何セクタか ・BPB_RsvdSecCnt →① ・BPB_FATSz32 →② ・BPB_RootClus →ルートディレクトリの先頭クラスタ番号
FAT32について(BPB) ・パーティション内のBPBにそのパーティションの管理情報(詳細な情報)が格納されている (例) 1クラスタに何セクタがあるか など ・クラスタとは、セクタの集まり。今回の場合は1クラスタ = 4セクタ。ファイルはクラスタ単位で管理 されている。 BPBからは以下の四つの情報を取り出す ・1クラスタ何セクタ? → BPB_SecPerClus (13) ・パーティション先頭から、最初のFAT領域までのセクタ数 → BPB_RsvdSecCnt (14,15)
・1つのFATが占めるセクタ数 → BPB_FATSz32 (36~39) ・ルートディレクトリの先頭クラスタ番号 → BPB_RootClus (44~47)
FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域
Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1
MBR パーティション テーブル1 PT_LbaOfs パーティション1 BPB FAT1 FAT2 ユーザー領域 求めるものは
ユーザー領域内に ある目標ファイルの セクタ番号 ① ② ② ・BPB_SecPerVlus →1クラスタ何セクタか ・BPB_RsvdSecCnt →① ・BPB_FATSz32 →② ・BPB_RootClus →ルートディレクトリの先頭クラスタ番号
FAT32について(ディレクトリエントリー) ここまでの情報でユーザ領域の先頭セクタ番号が求まる → PT_LbaOfs + BPB_RsvdSecCnt + 2 × BPB_FATSz32 次に、目標のファイルのクラスタ番号を求める必要がある。
→ その情報を管理するのがディレクトリエントリー ディレクトリエントリーにはファイルの名前やそのファイルの先頭クラスタ番号が保存されている。 SDカード内にあるファイルはそれぞれディレクトリエントリー(32バイト)を1つ持っており、そのディ レクトリエントリーにあるファイル名を参考に、目標ファイルのディレクトリエントリーを探し出す。 見つけることができたら、そのディレクトリエントリーから目標ファイルのクラスタ番号を読みだす。 ① ②
FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域
Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1
BPB FAT1 FAT2 ユーザー領域 PT_LbaOfs + ① + 2×② クラスタ
0 クラスタ 1 クラスタ 2 BPB_RootClus ディレクトリエントリー ・ファイル名 ・位置 etc
FAT32について(ディレクトリエントリー) ディレクトリエントリーはユーザー領域のBPB_RootClusに格納されている。 その中で、32バイトずつデータを取り出して、目標ファイルのディレクトリエントリー を探し出す。 ⇒以上の作業により、目標ファイルの先頭セクタ番号が求まる ユーザ領域の先頭セクタ番号 + (目的のクラスタ番号 - 2)
× BPB_SecPerClus (クラスタ番号0,1は使用することができないため-2をする)
クラスタ 6 ディレクトリエントリー ・ファイル名 ・位置 etc PT_LbaOfs + ① + 2×②
+ (6 - 2) × 4 CMD17の引数に指定 PT_LbaOfs + ① + 2×②
FAT32について 今回は簡単にするため、SDカード内には色情報が含まれる3バイトのファイル一つの みを格納した。 → ファイルの大きさが4×512バイトを超えると、複数のクラスタで管理する必要が ある 複数のクラスタで管理するための情報が含まれているのがFAT。 FATは各クラスタの次に続くクラスタ番号を管理している。 → クラスタをまたいでファイルの保存が可能 ファイル数が多い場合、ディレクトリエントリーが一つのクラスタに格納されるとは限 らないので、この場合もFATが必要。
FAT2はFAT1のコピー。
FAT32について(ファイルシステムの全体像) MBR パーティション1 パーティション2 パーティション3 パーティション4 BPB FAT1 FAT2 ユーザー領域
Boot Strap Loader パーティション テーブル2~4 Boot Signature パーティション テーブル1
手順(SDHCのみ) 1. 低速クロックでスタート 2. ダミークロックを流す → コマンドを受け付ける準備を完了 3. CMD0 → ソフトウェアリセット 4. CMD8 → 動作電圧確認(必要) 5.
ACMD41(CMD55 CMD41) → 初期化 6. 高速クロックに切り替え 7. CMD17でセクタを読み出す。 → 引数にセクタ番号を指定する。 CMD17を使って、PT_LbaOfsやBPB_RootClusなどを読みだして、その値をも とに目標ファイルの先頭セクタ番号を求める。そして、その番号をCMD17の引数に 渡すことで、データを取り出すことができる。 (あらかじめ、目標ファイルの先頭セクタ番号がわかっていたら、PT_LbaOfsやBPB_RootClusなどを読みだす必要なし)
ラズパイによるテストの結果 ・ 現状 ラズパイを使って、実際に動かした。 SDカード内には色情報 0x00, 0x00, 0xFF (青) を含んだファイルを格納して いる。 実行した結果、右上の図のように青色の正方形の描画に成功した。 その後、SDカード内のデータを0x00, 0xFF,
0x00 (緑) に変更した結果、右下の図のように緑色の正方形の描画に成功した。 現状 ⇒ FPGAで実装したが、初期化も失敗 → 画像描画までは進める
参考 ・MMC/SDCの使い方 → https://elm-chan.org/docs/mmc/mmc.html ・FPGAでSDカードと通信してみる。 → https://rafale28.hatenablog.com/entry/2017/09/06/143309 ・FAT32ファイルシステム読解 → https://zenn.dev/hidenori3/articles/3ce349c02e79fa