パスワードを忘れた? アカウント作成
15304583 journal
日記

kitune-sanの日記: MMCへのアクセスををSystemVerilogで書いてみる #1

日記 by kitune-san

8bitのISAのインターフェースからから身近にある記録媒体ににアクセスしてみたいと思い、
比較的簡単そうな、MMCやその互換カードへのアクセスをするデバイスを実装してみることにした。

まずは、MMCと通信する部分を作成した。
最初SPIで実装してカードの初期化まで行けたが、今後eMMCへのアクセスをすることを考えネイティブモードで再度作成した。
ネイティブモードで作成する上で課題となったのは以下の点
1. SPIモードと違い、8ビットごとの通信でなくスタートビットを起点として送受信を行う。
2. DATラインの先頭/末尾データは、スタート/ストップビットを含めると9ビットとなる。
3. CMDのレスポンス受信処理と、DATのデータ受信処理が同時に行われる。
4. 通信データにCRCを付加する必要がある。

これを解決するために、以下の動作とした。
1. 停止中にstart_communication=1のパルスを入力すると通信を開始する。
2. 〜_ioで送受信方向を設定する。1で受信、0で送信。
3. check_〜start_bit=1で受信開始すると、スタートビットの検出を開始する。クロックの立ち上がり時にCMD=0でコマンド受信を開始する。クロックの立ち上がり時にDAT=0でデータ受信を開始する。
4. set_send_〜=1で送信開始すると、送信データに格納されたデータの送信を開始する。
5. 送信/受信どちらかのイベントが発生するとそれに対応したイベントの〜_interrupt=1が発生し、通信を停止する。start_communication=1パルスの入力でイベントを解除し、続きの動作を行う。
6. コマンドの送受信データ8ビットには、ストップビットとデータビットが含まれる。
7. データの送受信データ8ビットには、ストップビットとデータビットが含まない。最初の送信データに0xFE(スタートビット), 最後の送信データに0xFF(ストップビット)を付加する。
8. 送受信中に各データのCRC計算を行い、読み出せるようにする。clear_〜_crc=1でCRCを0にクリアする。

次の目標はこのモジュールを使用して、MMCの初期化を行う。

また、読み書きの命令は、uPD765的な方法(コマンドー>実行(割り込みorDMA)ー>ステータス読み取り)でできないか考え中。
ただし、uPD765と全く互換にはせずに以下のようにすることを想定
- CHS的なアクセスだと計算が面倒な上にアクセスできる領域に制限がかかるためLBAアクセスに変更する。
- アクセスコマンドは、write,readのみ。
- アクセスできるブロックサイズは512バイト固定にする。DMA転送で途中にT/Cが入る場合には。割り込み転送に切り替えるようにする。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond

読み込み中...