スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FPGAのお勉強(03)

今回は、SDカードの直下に置いたwaveファイルのセクタを検索する方法を調べてみました。
しかし、ちと難航中・・・



SDカードのファイルを読み込むためには、FATファイルシステムの構造を理解する必要があります。
今回用意したSDカードは、2GBよりも大きいサイズで一般に普及しているFAT32という形式でフォーマットしてあります。

で、まずは、プログラムを作る前に情報収集。。。
このあたりを参考にさせて頂きました↓

http://blogs.dion.ne.jp/sbeach/archives/10412960.html
http://beagle1.blog.so-net.ne.jp/2011-11-30
http://amahime.main.jp/pic24f/main.php?name=pic24f

ええと、ざっくりまとめると。。。
・SDカードの記録アドレスは、セクタ(基本は512MB)とクラスタ(数セクタ~数十セクタ)毎に割り振られている。
・セクタ0(アドレス0x00000000)はMBR(Master Boot Record)と呼ばれ、
 論理オフセット値が書かれている。
・オフセット値以降のセクタはFAT(file allocation table)と呼ばれ、
 各ファイルのアドレスが記述されている。
 特に最初のセクタはBPB(Bios Parameter Block)と呼ばれ、
 クラスタのサイズ、FATのセクタ数等が書かれている。
・FATの後のセクタには、ルートディレクトリ(ルートフォルダ)のデータが格納されている。
 ルートディレクトリにあるファイルやフォルダの情報が書かれている。
・ルートディレクトリの後のセクタには、ファイルデータが格納されている。
 ファイルサイズが大きくて1クラスタに収まらないデータは複数のクラスタにまたがって存在するが、
 連続したクラスタに書かれているとは限らない。ファイルデータを読み込む場合、FATを参照して、
 クラスタのアドレスを辿っていく必要がある。
 
こんな感じでしょうか?

とりあえず、ルートディレクトリに置いたファイルの先頭データを参照するための手順は、
①セクタ0(MBR)を参照し、FATの先頭セクタ(BPB)のアドレスを取得する
②FAT先頭セクタ(BPB)を参照し、ルートディレクトリのアドレスを取得する
③ルートディレクトリを参照し、該当ファイルの先頭クラスタのアドレスを取得する。
④該当ファイルの先頭クラスタのアドレスを参照する。
これだけのことが必要です。

更に、ファイルのデータを終わりまで参照するためには、
⑤FATを参照して、クラスタ毎に分割されたファイルデータがどのアドレスに書かれているかを辿っていく。
処理が必要になります。

これのプログラムを書くとなると大変だなあ。。。
FPGAの入門に、SDカードプレーヤー作るってのは、敷居が高すぎるかも。
メインで作成を考えている機器のほうが、よっぽど簡単に作れるよ。。。
まあ、ギブアップするのはまだ早いかな?
頑張って作ってみましょう。


で、まずは「カンニング」しておきます。
ディスクダンプエディタというソフトを使って、PCでSDカードの情報を確認します。

まず、セクタ0(512Byte)の情報を確認してみました。
FPGA_301.gif

0x1C6~0x1C9(454~457)に00 20 00 00 とあります。これはオフセット値と呼ばれ、FATの先頭アドレスを示しています。
リトルエンディアンのため、値は0x2000、FAT32の場合、これがそのままFATの先頭アドレスとなります。
(FAT16の場合は、オフセット値×512が先頭アドレス)


では次に、FATの先頭アドレス(BPB)の情報を見てみます。
アドレスは、先ほど取得した0x2000です。
FPGA_302.gif
0x000~0x00Aあたりまでは、どのSDカードも共通の数値みたい。
で、確認すべきデータは、以下の通り。
①0x00B・0x00C:1セクタのByte数(0x0200=512Byte)
②0x00D    :1クラスタのセクタ数(0x08=8個)
③0x00E・0x00F:FATデータの開始セクタ番号(0x0518=1304番目)
④0x010    :FATデータの複製数(0x02=2個)・・・ファイル破損検出のため、FATデータは複数格納されている
⑤0x011・0x012:ルートディレクトリのエントリー数(0x0000=0個)・・・FAT16では512固定
⑥0x024・0x027:FATが使用しているセクタ数(0x1D74=7540個)・・・FAT16では0x016・0x017に存在
⑦0x055・0x056:FATの形式(アスキーコードで32)・・・FAT16では0x039・0x03Aに存在


では次。
FATデータの中身はいったん飛ばして、
ルートディレクトリのアドレスを参照してみます。
アドレスは、前述の①~⑥の数値に対して
③+④×⑥+オフセット値
と計算されます。
今回のSDカードの場合、
⑧0x0518+0x02*0x1D74+0x2000=6000
です。
FPGA_303.gif
アスキーコードで、何やら名前が書かれているのが分かりますね。
32Byte毎に、各ファイルやフォルダの情報が書かれています。
確認すべきデータは、以下の通り。(32Byteデータなので、各ファイルは番地に+0x020、+0x040、+0x060…して見て下さい)
ここでは0x060のデータについて見てみます。
・0x000    :0x05、0xE5 なら、ファイルが削除されている。0x00 なら、ディレクトリのファイルは終了。
・0x000・0x00A:ファイル名(8文字+3文字)。
・0x00B    :ファイル属性。0x0F の場合は、ロングファイル名。0x20 が通常ファイル。0x10 がディレクトリ。
⑨0x01A・0x01B:ファイルの先頭クラスタ番号(0x0003)
・0x01A・0x01B:ファイル長

さて、これでようやく、ファイルの先頭アドレスが計算できます。
アドレスは
⑧+⑤×32÷①+(⑨-2)×②
と計算されます。
今回は、0x6008かな?


ファイルの先頭アドレスを見てみると。。。
FPGA_304.gif
あ、なんか、アスキーコードを見ると、waveファイルっぽいですね!
ようやくファイルに辿り着きました。


さて、最後にFATデータを参照してみます。
FATデータの先頭アドレスは
③+オフセット値
です。今回は、0x2514になります。
FPGA_305.gif
ここにファイルデータのクラスタの繋がり情報が記述されていますが、これはまたいずれ、ちゃんと勉強しようかな?


うへえ、これらを全自動で行うプログラムを作らなきゃいけないのか・・・
とりあえず今回は、FPGAに固定アドレスをプログラミングして、LCDに結果を表示させてみました。
↓はセクタ0の0x1C0~0x1CFの場合。
FPGA_306.jpg
あれ?アドレスが一つずれてるかな?
まあ後で直しておきましょう。

で、続けてセクタ0x2000(FAT BPB)を見ようとしましたが、、、
あれ~エラートークンが返ってきて、読めない。。。
なんだか、0x1FFFまでは読めるのに、0x2000以降が読めません。
なんで~???

・・・と、今日はここまでです。
次はいつになるかな~・・・





スポンサーサイト
Secret

プロフィール

カニ

Author:カニ
DACやアンプの自作がメインの、オーディオブログです。
自作基板の頒布も行なっています。カテゴリ「頒布」をご覧下さい。

ニアフィールドリスニングや、ポータブルオーディオにも手を染めたいんですが、いつになることやら。。。

繊細で柔らかい音
実在感のある音
を目指して、
ゆっくり、ゆっくり、潜航中。

カテゴリ

月別アーカイブ

最新コメント

検索フォーム

最新記事

リンク

カウンター

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。