MMC/SDC 関連
ある程度しっかりした文章を作りかけて、放置してしまったので雑多に箇条書きにしてごまかす。
SD カードの write コマンド関連:
- CMD24: WRITE_BLOCK は遅くて実用的ではない
- CMD25: WRITE_MULTIPLE_BLOCK だけを使う(open-ended)と処理時間は CMD24 とほぼ同じで SDC では実用的ではない
- CMD25 は CSD の WRITE_BL_LEN を気にせず 0x200 byte 単位で書いても都合良く動いてくれるが、そこらへんの正式な仕様がどこに書いてあるかわからないのでしっかりと扱えない
- ACMD23: SET_WR_BLK_ERASE_COUNT をやってから CMD25 をやるととても早くなる
- BLK_ERASE と書いてあるのでコマンド発行後、アライメントがかかって erase がかかると思いきや、ある程度のデータを書き込むか、stop token を渡してから動いているようだ
- ACMD23 の値は大きめの値をいれて途中で打ち切っても都合良く動いてくれるが、正式な仕様が不明
- ACMD23 は SDC 専用で、 MMC は CMD23 専用。erase の解釈が違いそう。
- xCMD23 + CMD25 は pff の disk_writep という1つの関数で行うには限界があるので、3つの関数にばらして実装した。汎用的実装からMMC/SDC専用実装になってしまった。(いまのとこ SDC だけで使うしかないので問題ない)
MMC の 400kHz 関連:
- MMC の起動時はオープンドレインモードに設定されている
- オープンドレインモードは 400kHz で動作させる必要がある
- SDC ではオープンドレインモードは存在しないので早いクロック(24MHz が標準らしい)でいきなり動かして良い
- SDC のライセンス回避である大義名分の MMC の例外的実装としては 400kHz 動作はやらないといけない気がする
そこそこ仕様が分かってきたし、SPI に執着せず 4bit bus でもいけそうな気がする。ただ 4bit bus にしても、現在の実装ではたいしたスピードアップが期待できない。
本物の MMC で実験してみたくなった:
- MMC 自体は本当に廃れてしまっているんだが、オークションで探すとちらほらでてくる
- 横長に変化したかと思いきや、通常サイズの MMC を半分にぶった切った RS-MMC や、 bus 幅が 8bit に進化しすぎた MMCplus などマイナーな進化がありすぎて意味が分からないし、普及していない。
- 既存のカードリーダーの対応数の水増しはここら辺でやっているらしい。8bit bus は使えずに 1bit でやるんだろう。