SDカードの最近のブログ記事

以前出たような複数カードのストライピングで高速化&1.8インチ SSD化できないものか、ちょっと思考実験してみましょう。


サイズと容量について

現時点で、100円ショップでも売ることが可能な格安のmicro SDカードがあります。 こいつを10枚でも20枚でも使ってストライピングできないものでしょうか?

サイズ的には、1.8インチHDD/SSDの体積は

8.0 x 54.0 x 78.5 = 33,912mm3
  

となります(東芝製MK8007GAHデータシートより)。

一方、micro SDカードのサイズは、

11.0 x 15.0 x 1.0 = 165mm3
  

となります。

物理配置や基板、配線等を無視すれば、1.8インチHDD/SSDのスペース内にmicro SDは200個以上入ることになります。

実際にはソケットに入れる必要があるでしょう。 こちらの製品例では、ソケットの外形寸法は

13.7 x 15.3 x 1.4 = 293.454mm3
  

です。また、プッシュプル方式ではないですが、こちらのアダプタ

12.6 x 14.5 x 1.5 = 274.050mm3
  

と、さらに小さくなっています。

計算だけだとこれでもHDD/SSDに100個以上の体積を収められますが、現実的には無理でしょう。

実際には、最大限でもこんな感じじゃないかな?

20081213-MicroSD.png

縮尺はあわせてあります。 緑色のが基板部分で、斜め線のがmicroSDカードスロットです。 厚さを考えると裏側にも同じだけ装備できるので、計24枚入ります。

これで、2GBのmicroSDを使えば48GB。 メディア代がおよそ2,500円。 安い~!


マイコンは使えるか?

次はこれのコントローラです。

趣味の電子工作の範囲だと、SDカードの入出力は簡単に可能で、もっぱらストレージの主流ですね。 ただ、電子工作ではプログラムが簡単なSPIモードを使うため、SDカード側のクロック制限はおおよそ25MHz(約3MB/sec)となります。

また、AVRを使うとすると、最大周波数は20MHz、SPI入出力ではその半分のクロックが最大供給クロックなので、結局10MHzです。 すると、ビット単位の入出力なので1.25MB/secとなり、あまり高速ではありませんね。 PICの場合も最大動作周波数は20MHzのようなので、似たり寄ったりです。

でも、超小型のATtinyあたりを16個並列動作させて、1ビットごとに分散させればスピードも16倍(パラレルATAの信号は16ビット幅)。 これでやっと20MB/secだ~。

どうも、これらの簡単マイコンを使うソリューションはあまりうまくないですね。


もっと高性能なコントローラ?

組み込みCPUは非常に多種のものがあり、ハイパワーなものから小消費電力なものまで千差万別です。

でも、一般的に上記のマイコンよりはかなり高速であり、数100MHz程度のものも珍しくありません。 SHシリーズなんか結構いいかも? これなら、ストライピングしたSDカードを十分ドライブできそうです。


というわけで、技術的には十分可能そうではあります。 さて、誰か作ってくれないかなぁ??



AVRのプログラマを作り、ブレッドボード上でプログラムできることを確認したので、いよいよ(?)まともにSDカードリーダを作り始めました。

回路図

回路図は以下のようになっています。

20081130-AVR_SD.PNG

SDカードが3.3V動作なので、途中で電圧変換をしなくて済むようにAVRはATmega8Lを使います。きわめて簡単な回路ですね。

一応説明をすると、入力の5Vは48M033Fで3.3Vに降圧しています。 ^A7と^IORQのORを割り込み入力とします。 A6~A3はすべてORをとってPB0に入力しており、I/O空間はA2~A0の3ビット分を予約しています。 PC側からみれば、ポート00~ポート07までを使います。

SDカードとの入出力はmega8Lに搭載されているSPIをそのまま使います。 同時に、ISPにも接続することにより、PC-6001からの電源をもらってプログラムできるようにしてあります。 プログラムを行う際はリセット端子がPCからの入力では都合が悪いので、スイッチをつけています。

ハード実装

手抜き実装で、プルアップ抵抗をまだ入れていませんが、とりあえず実装したものはこんな感じです。 一応この程度でも動くことはブレッドボード上で確認してあります。

20081130-AVRSD-card.jpg

中央下部に空間を空けてあるのは、あとでBIOS ROMを入れることを考えているためです。

簡単なテストプログラムを作って試してみているのですが、今のところPC本体がちゃんと起動しません...。

SD(HC)カードでは、ファイルシステムのフォーマットが物理的に制限されているわけではありません。 そのため、FAT16/2GBという規格のSD(SDHCではない)カードに、FAT16の規格を越える4GBサイズのものがありました。また、既存のSD(HC)カードに、規格以外のフォーマットをかけることも可能です。

SDHCが採用しているFAT32の論理上限は2TBなので、ソフト的な観点からは32GBを越えるカードも可能です。 しかし、実際には売られていません。なぜでしょう。

と思っていたら、英語版Wikipediaに情報がありました。


SDカードの仕様では、カードに128ビットのIDが入っています。 HCではないSDカード(仕様1.x)では、このうち12ビットがメモリクラスタの数(1~4,096)、3ビットがクラスタあたりのブロック数(4, 8, 16, 32, 64, 128, 256, 512)を表しています。 SDカード1.xのうち、古い仕様では、ブロックサイズが512バイト固定のため、最大容量は次のように求められます。

4,096(メモリクラスタ数) x 512(ブロック数/クラスタ) x 512(ブロックサイズ) = 1GB
  

より新しい1.xの仕様では、上記のIDフィールドにブロックサイズを表す4ビットの値を持って1,024および2,048バイトをサポートするようになり、1GBを越えるカードをサポートするようになりました。 しかし、これによりデバイスによっては1GBを越えるカードを読めないことも出てきました。 例えば、私の使っていたVodafoneの705SHはmicroSDカードをサポートしていますが、1GBまでのカードしか認識しません。 これなどは、おそらくこの古い仕様が原因ではないかと思います。

さて、SDHC(仕様2.0)では、メモリサイズを22ビットのフィールドで表します。 値は512kBの倍数です。 しかし、現状では22ビットのうち16ビットしか使われていません。 すなわち、フィールドの最大値は65,536となり、

512(kB) x 65,536 = 32GB
  

となります。 これが「32GB上限」のトリックです。

22ビットをフルに使うと、最大値は

512(kB) x 65,536 x 64(追加の6ビット分) = 2,048GB
  

となり、FAT32の論理最大の2TBまでサポートできることがわかります。

(11 Nov. 2008追記) 2TBはデフォルトのクラスタサイズ512バイトの場合です。FAT16のときのようにクラスタサイズを大きくすればさらに大容量化できます。

もちろん今これを行えば、4GBのSDカードのように互換性の問題も抱えることにはなるのですが、規格上はサポート可能にしておきながら、なぜ制限してしまったのでしょうか。

ちなみに、Windows XPが32GBを越えるFAT32のフォーマットを行わないのは、単にマーケティング上の理由です(NTFSに誘導したいため)。SDHCカードが32GB止まりであることとは、おそらく何の関係もありません。SDHCカードにNTFSなんか採用したら最後、激しくMicrosoft縛りがかかるばかりか、アクセスするためのソフトウェア・ファームウェアが複雑になりすぎて実用にならないでしょう。いくらSDカードアソシエーションのメンバにMicrosoftが入っているからといって...ねぇ。

なお、SD(HC)カードおよびホストアダプタを製造販売するには、SDアソシエーションのメンバになる必要があり、メンバに課される年会費は$1,500、加えて製造販売のためのロイヤリティは年$1,000です。まぁ、この手の会費としては格安ともいえます。そのせいか、SDアソシエーションのメンバ企業は非常に多く、「何でこの会社が?」というような企業もメンバに入っています。でも、意地でもソニーは入っていません

SDHCは登場からあっという間に最大容量の32GBに達し、 その32GBのSDHCカードが値下がりし始めています

SSDの代わりとしての利用も期待できるわけですから、早いところ何とかして欲しいものです。


(以下 11 Nov. 2008追記および修正)

FAT32の仕様自体は2TBまでサポートしているのは上記のとおりですが、以下の制限があります。

1ファイルのサイズは4GBまで

これは良く知られていますね。 理由は、ファイルの情報が格納されるディレクトリエントリにある (詳しくはこのページのDirectory Entry参照)ファイルサイズのフィールドが32ビット(4バイト、DWORD)分しかないためです。 FATのクラスタチェインだけを考えれば4GBを越えるファイルを表現することもできますが、ファイルサイズフィールドとの不整合が発生するため、アプリケーション誤動作の原因になりますし、高レベルAPIではエラーになる可能性があります。

容量が大きくなるにつれ、いわゆる「デフラグ」や空きスペースの計算量が極めて大きくなる

FATは、容量が大きくなるとフラグメンテーションが発生しやすいという問題はよく知られていますね。

ではなぜ計算量が大きくなるかというと、FATでは領域がクラスタ単位で管理されているFile Allocation Table(だからFAT)を基にして動作するためです。FAT32では、クラスタごとに32ビット(4バイト)の情報を持っています。

FATの各エントリは、次のクラスタが何番なのか、ファイルの最後なのか、利用されていないのか、不良なのかなどの情報を表しています(リンクリスト)。これが、FAT32では28ビット分まで使われるので、最大容量まで使い切ると228エントリ存在することになり、FAT領域の大きさは

4(バイト/エントリ) x 228(エントリ) = 1GB

という容量になってしまいます。空き容量を計算するために1GBの読み込みを行うのは、FATが主に使われている組み込み分野はおろか、現状のPCでも結構つらい作業でしょう。

これらの解決策として、exFATが提案されていますが、いろいろ技術的な事情(HDDには使えない、Windows XPでも使えない)や大人の事情(ライセンスが不透明、仕様が公開されていない)から、そう簡単には現在のFATの代替にはならないでしょう。


昨日SSD関連の最新動向について少しまとめましたが、続報です。SDHCカードの16GB最安値が3,680円になったそうです。1GBあたり230円ですね。

以前話題になったSDカードをストライピングしてSSDにするデバイスを使えば、高速な96GBが22,000円ちょっと(デバイス除く)で手に入れられることになります。これはかなり現実的な価格ですね。




ファイルシステムのアクセス方法や、コマンドプロンプトからの引数の受け渡し方法などを書いておきました。

Sourceforgeで参照できるようにしてあります。

それと、普通のユーザーズガイドをこのサイトに出してませんでしたので、以下に置いておきます。

アダプタの販売はこちらで扱っていますのでよろしくお願いします。

さて、AVRを使ってSDカードリーダを作ろうと思っています。本体側からIn/Out 1命令で入出力ができれば、リアルタイムでの動画再生なども不可能ではありません。

とりあえず現状の回路図。

AVR_SD.PNGポイントは以下のようなところです。
  • SDカードは3.3V動作なので、回路全体を3.3V動作にしています。
  • ATmega8Lは内蔵クロックで8MHz動作させます。
  • ISPインタフェースを用意しておいて、プログラムの書き換えに備えます。
  • アドレス線は7432でプリデコードしておくことにより、AVRのI/Oを節約します。
AVRのI/Oポートが少しあまっているのですが、とりあえず未使用にしておきます。

先日秋葉原でEジスPenやらプリント基板キットやらを買い込んできたのですが、この回路図からレイアウトを起こすのが面倒でそのままになっています。きっと世の中には自動レイアウトツールもあるんでしょうね...。

続いて、ムービーエンコーダとプレーヤをリリースします。

それぞれ中にREADMEがありますので参考にしてください。

プレーヤですが、実はこのままでは再コンパイルできません。Hexameterをダウンロードし、適切にMakefileを設定しなおす必要があります。私の環境のままアーカイブにしてしまったためなのですが、直しているといつまでたってもアップロードできないので、とりあえずまずはこれで許してください。

Hexameter 2.1.2をリリースしました.

Sourcceforgeからダウンロードできます.

変わったのは、SDOS 1.1用のテンプレートを用意したことだけですのでたいして大きな変化ではないですが、もしSDカードアダプタをお持ちの方でSDカードをアクセスしたいという奇特な(?)方がいらっしゃればぜひご利用ください. また、SDOS開発時に作成したいろいろ有用なルーチンも用意してますので、良かったら使ってみてください. 戦士カートリッジ版、1M ROMアダプタ版双方で動作するはずです.

一昨日日本から戻ってきました. 時差ぼけで体の調子が悪いのですが、SDOS関連ファイルの公開に向けてファイルの整理を始めました.

Hexameter (SDCC用コンパイル環境)のテンプレートとしてSDOS 1.1用の環境を準備しているほか、ムービープレイヤーなどのソース/バイナリファイルを公開できるように整理しています. とりあえず、Hexameterの方はsourceforgeのCVSの更新は終わったのでダウンロード自身は可能ですが、簡単にダウンロードできるリリース用のアーカイブはまだ準備していません.

私はいったん「入って」しまうと夢中で作業して一気に終わらせてしまう方なのですが、気が乗らないときは途中でほっぽり出してなかなか進みません. よくないことは分かっているのですが...

PC-6001シリーズのJoystickポート用SDカードアダプタですが、いよいよ発売されることになりました。

価格は1,800円です。普通のPC用のカードアダプタと比べても高くはないでしょ?

ハードウェアは私が作ると品質が確保できないので、西田ラヂオさんにお任せしています。もちろんSDOS(ドライバ)のROM付きです。

西田ラヂオさんのところで扱っていますので、興味のある方はどうぞ。

SDカードに記録したPC-6001用のゲーム(P6ファイル)がそのまま読み込めますので、膨大なPC-6001の資産が活用可能です。 また、独自のマシン語フォーマット(MP6)にも対応しています。今後こちらの対応ソフトウェアや、開発環境も公開していく予定ですのでお楽しみに。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちSDカードカテゴリに属しているものが含まれています。

前のカテゴリはProgrammingです。

次のカテゴリはWeb 2.0です。

最近のコンテンツ アーカイブ