2011年6月25日土曜日

SDメモリカードプレイヤー機能の実装14(FATクラスタチェーン処理)

 SDカード上の曲データを再生するには、FATクラスタチェーンをたどり次々とクラスタをたどっていく処理が必要になります。

CMD18でバーストリード化すると決めた当初、1クラスタ分をいっきょに読み、CMD17でFATクラスタチェーンの該当部分を読み次のクラスタを検索しながら曲の最後まで再生させる予定でした。

1曲分のクラスタチェーンを曲再生前にすべて検索し内部に持つことも検討していましたが、内部メモリをかなり消費してしまうのであきらめていました。

この方法でも一応問題ないはずですが、再生中のFATクラスタチェーン検索処理分の帯域を消費してしまうことと、内部データFIFOの深さを深めに設定する必要があります。
帯域の消費は、その分SDカードへのクロック速度を上げてあげなければなりませんし、内部FIFOの深さを深くするのは、最終的にNiosIIのプログラムを内部メモリ化することを検討しており、このためにはあまり好ましくありません。


しかし5月24日 SDHCカードの調査で取り上げたInterface 2010年9月号 FATファイルシステム特集の第5章に、参考になる記述があり、FATクラスタチェーンを圧縮する方法が書かれているのを発見。
上記問題の解決に効果があると考えられ、これを採用させてもらうことにしました。


何も書かれていない状態のSDカードに曲をコピーした場合は、ほとんどフラグメントは発生せず実際には1つの連続した領域に格納されるはずです。
よって何回も消去、書き込みをしない限りは、圧縮FATクラスタテーブルのサイズは、8領域分か16領域分も用意しておけば十分のはずです。
個人的に使用している限り、1曲は連続領域に書き込まれているという前提でも良いかもしれません。




 FATテーブルの圧縮

処理の概要は下記のようになります。


*曲再生の前処理(NiosII処理)*

FATクラスタを検索し圧縮FATクラスタテーブルを内部メモリ上に構築



*曲再生中(ハード処理)*


[開始時]
領域①の先頭クラスタアドレスをCMD18のアドレスに指定

[再生中]
ⅰ.内部データFIFOが溢れそうになったら(停止閾値超過)、CMD18を停止
=>内部データFIFO読み取り再開閾値を下回ったら停止した次のクラスタをCMD18の
アドレスに指定してバーストリードを再開

ⅱ.圧縮FATクラスタテーブルの領域最終クラスタアドレスに一致したらCMD18を停止
=>次の領域の先頭クラスタアドレスをCMD18のアドレスに指定してバーストリードを再開

[再生終了]
データ長分の読み取りに達したらCMD18を停止

0 件のコメント:

コメントを投稿