file system driver その3

SPI はやめて SD card mode で読み込むところまで実装できた。かなり詰まったが、いまのところ全て改善できて databus 4bit にして正常に読み取れるし、SDHC の初期化も通るようになった。FAT32 のドライバはまだ書いてないので初期化だけ。

google 先生が教えてくれる結果は大半が SPI なので、参考にならないことがおおかったり、 SDHC のことがかいてなくてちょっと面倒だった。

CMD3 の返答が変

CMD2 発行後に CMD3 でカードの認証を行うんだが、カードによって無返答の場合があって、2,3度読み直すと認証が通るという点。

それ以外にも CMD0 のあとの CMD55 (ACMD41 の prefix 命令)などもどうも反応が怪しかった。

これは、 4.4 Clock Control に書いてあるように、command -> response などの流れの末尾に 8 bit 空のクロックを送るべきというところを見落としていたため。これを修正したら全ての SDSC カードは使えるようになった。

SHDC の初期化が通らない

この時点で "SD Specifications Part 1 Physical Layer Simplified Specification Version 4.10" を読み始めたら、古い流出資料以外にやるべきことがちゃんと書いてあった。この資料は公開されているものだからここに書いても問題ないはず。

まず CMD0 の後に CMD8 を発行して、使用電圧範囲を設定しないといけない。いけないが、有効な設定項目は1つだけで別の目的が資料に書いてあるので、読んでおくこと。

次に ACMD41 の argument を正しく設定する。設定しないと ACMD41 の返答がいつまでも初期化が終わらなかったり、 CMD55 の反応が返ってこなくなる。これらはたぶん嫌がらせ。やりかたは書いてあるものの自分の英語解読能力が悪いのか、はたまた嫌がらせが入っているのかはわからんが、 bit23:0 を 0 以外にしろと書いてあるが、どうも bit23:16 を 0 以外、 bit15:0 は 16'h0000 らしい。

PIO へのアクセスの仕方が悪かった

SPI では返答のバリエーションも少なかったり、コマンドもわりと単純だったので PIO を呼び出す方法を簡略化してたんだが、このノリで native mode を実装していたのが間違いで、さらに資料をちゃんと読んでないことも停滞の原因となった。

PIO で 1bit ずつ clock を上げ下げするのは基礎的な確認が目的だったので、 PIO を呼び出す関数もハードから理論値で clock を制御するためのレジスタに取り替える体で作り直した。

data read が SPI と native で勝手がかなり違う

SPI の場合は response と data は DO から出てくるのだが、native の場合は cmd から response, dat から data が出てくる。

仕様書には rensonse と同時に data が出てくると書いてあって、ソフトでやる場合はかなり迷惑。ただ、実験に使ったカードではそういうことはなかった。(response と同時に data を取れるように穴を開けまくったのに、動作確認が出来ないというのは信頼性に欠けて逆に困る)

利点もちゃんとあって、 read 途中に STOP_TRANSMISSION を発行できて、途中で card からの data の出力も打ち切れる。 SPI の場合は data の出力をやめる場合は block の区切りまで空読みする必要があったので無駄な時間も発生するし、ちょっとした対応を用意しないといけないのと比較すると楽だ。SPI ではこれらを考慮して blocksize は適切な調整を行う必要があるのだが、native では blocksize は最大値を設定して好きなときにとめたほうがよさそうと感じた。