SDカードコントローラをFPGAで試作。

ここでは、以下のSDCARDなどを、4ビット高速データ転送(24MHz〜48MHz)で制御することを目指します。
SPIで操作する試作はこちら。SH7144(インターフェイス誌の付録基板、SH2)でSDカードを制御
左から、@128MB、A256MB、B512MB、C1GB、D2GB、E4GB、F8GB、G16GB

SDカードの製作というと、雑誌などでは、たいてい1ビットのSPIモードで制御し、 音楽データの読み書きとか、あまり高速でないデータロガーとかの製作記事はあっても、 SDカードの本来のインターフェイスである4ビットの高速インターフェイスで操作するものは見かけません。
その理由は、SDカードの高速インターフェイスでアクセスする方法を使用すること自体が、SDカードアソシエーションのライセンス承認を必要とするからと思われます。無論これは、SDカードを使った製品を、商品として「SDカード」という名称を使って出荷すことには、SDカードアソシエーションとのライセンス契約が必要ということです。ここのURLのSDカードの解析内容は、以上のことを知った上で、自己責任で参考にしてください。SDカードアソシエーションのライセンスは、公開している Simplified Specification を参考に、SDカードを4ビットの高速でアクセスする場合は承認が必要であると、ここに以下のように説明されています。以下はその冒頭の注意書きです。

Notice of SD Simplified Specification
The following conditions apply to the release of the simplified specification ("Simplified Specification") by the SD Card Association and the SD Group. The Simplified Specification is a subset of the complete SD Specification which is owned by the SD Card Association and the SD Group. This Simplified Specification is provided on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified Specification may require a license from the SD Card Association, SD Group, SD-3C, LLC or other third parties.

つまり、突き詰めると、SPIモード以外でSDカードにアクセスするには、「SDカードアソシエーションとの契約と、契約料(30万円ぐらいか?)が必要です」ってことです。SDカードインターフェースそのものを、勝手に使ってはいけませんってことなのです。ハード機能を含んだ著作権みたいなものですね。
とはいううものの、これではこのURLが成立しなくなりますので、あくまでも個人使用目的のみとしておきます。販売されているSDカードには、「操作信号を解析してはいけない」とはどこにも書かれていませんので、また、SDカードの商品説明には、「SDカードアソシエーションの承認が無い装置で、SDカードの高速インターフェイスでアクセスしてはいけません」とも書かれていませんので、進めることにします。

SPIモードで操作する方法は、以下に解説されています。
例1:インターフェイス 2006年3月号
例2:トランジスタ技術 2007年2月号
例3:TECHI シリーズ Vol35
例4:PIC24Fの製作例
例5:MMCカードの使い方
    例5では、MMC/SDカードの詳しい解説があります
1ビットシリアルのSPIモードでは、マイコンに内臓された回路で簡単に実現でき、 ほとんどデジタル回路を外部に追加する必要がないので、SDカードを使った 製作例としてよく取り上げられいます。

 SDカードの本来の高速なデータ転送を実現する4ビットインターフェイスで 制御するには、SPIモードには無いCRC生成とか、チェックが必要になります。 また、コマンド体系が複雑になり、SDカードの動作電圧の問い合わせとか、カードのID 番号の取得とか、実際のデータ転送の前に、いくつかの関門を通過しなければなりません。

SDカードのハードウエア仕様の入手先

SDカードの仕様に関しては、以下のURLの、Members Site で、メンバーなら入手できますが、
SD Card Association これはSDカードを使った商用製品を出している企業が対象で、 そうで無い場合は、SDカードを4ビットインターフェイスで制御する資料として、その簡略版を 以下からダウンロードできます。
Simplified Version of PHYSICAL LAYER SPEC
しかし、このの資料は、SDカード本来の4ビット転送をするには、十分とは言えませんし、これだけでは設計はできません。だいたいどういうものであるかを解説しているだけで、SDカードコントローラを使って制御する場合でも十分とは言えません。なぜこういう中途半端な資料を公開しているのか、疑問です。SanDisk-Secure-Digital-Card Product-Manual を検索してでて来る、サンディスクの資料 ProdManualSDCardv1.9.pdf のほうが役に立つのではないかと思います。ここでの内容は、サンディスクの資料を参考にしながら、もっぱらSPI関係の解説と、SDカードリーダの信号を直接解析することで、4ビット高速転送を実現しています。


市販のカードリーダの信号を調査

信号調査に使ったカードリーダーは、50MHz対応、SDHC対応のI・Oデータの、USB2-W12RW。これを分解して基板を取り出し、SDカードの必要な信号線を引き出します。さらにFPGAにはSDカードのソケットを取り付け、ここにカードを入れて制御回路のテストを行えるようにしています。
左から、I・Oデータのカードリーダ USB2-W12RW、リーダー中の基板、SDカードの信号をFPGAに接続した装置

SDカードの制御では、どのようなコマンドとレスポンスがやりとりされているのか、市販のカードリーダを分解して、CMDを解析してみることにします。デジタルオシロスコープでは、とても記録しきれないので、長い時間のシリアル波形を記録できる、SDカード専用のロジック記録回路を作成します。SDカードの転送クロックは、最高で50MHzまで可能なので、50MHzの転送レートでも記録できる回路とします。CMDラインを、クロックの立ち上がりに同期してサンプルし、メモリに記録します。効率よくサンプリングするため、すでに判っている仕様は記録回路に組み込み、随時機能を追加して、CMDラインの全容を明らかにしていきます。CMDラインは、クロックの立ち上がりでサンプルすると取り込めますが、SDカードのクロック信号を、そのまま回路のクロックとして使うのはやめ、クロック信号も高速にサンプリングして、立ち上がりを検出して、そのときのCMDラインをラッチしてシフトレジスタに入れて取り込みます。なぜSDカードのクロックを使わないかは、クロックは途中で変化しますし(400kHz〜50MHz)、止まってしまうこともあるからです。
カードリーダ以外の装置の構成は、左から、FPGA基板 XCM-001-400、基板間の接続ユニバーサル基板、H8/3069Fネット対応マイコンLANボード

さらに、FPGA基板 XCM-001-400 には、SDRAMを追加して、信号を記録できるようにします。 右は、FPGA基板の裏で、SSP-82 サンハヤトのIC変換基板を取り付けて、パソコン用の512MBメモリから、MICRON の、48LC32M16A2P-75 という型名のSDRAMを取り外して接続しています。記録したデータは容量が大きいので、パソコンへの転送は、H8/3069Fネット対応マイコンLANボードのイーサネットを使い、操作はRS232Cで行います。転送ソフトは、H8/3069Fに tftp サーバーソフト(UDP/IP)を載せ、パソコンからは、コマンドプロンプトで、tftp で操作します。tftp では、一回の転送で32MBまでしか行えませんが、SDRAM制御回路も32MBまでなので、十分実用になります。





1、高速でサンプルできるFPGA回路を作る

使っているFPGAのクロックは、SDRAM用の96MHzが最高なので、50MHzのクロック波形の、立ち上がりタイミングをもれなく検出することはできません。2倍の192MHzでサンプリングすると検出できますが、このためにDCMを使って192MHzを生成して回路を動作させると、SPARTAN3ではスピード不足なので、96MHzの、posedge と、 negedge でラッチしたものを、posedge でもう一度同期化して、立ち上がりを検出します。こうすると、96MHzのクロックで全回路を制御できるので、SPARTAN3でも十分に動作してくれます。こちらが、96MHzのクロックを使って、50MHzまでのSDカードクロックの立ち上がりと、有効なそのときのCMDをラッチする回路です。
この回路で、SDカードのクロックと、CMDピンから、96MHzに同期化された、データ有効信号、cmdvalid と、CMDの値、sdcmdl を抽出できます。50MHzで転送する高速SDでも、安定に動作します。この回路の利点は、SDカードのクロックが停止しても、回路が止まることがないことです。というのは、カードリーダの信号を観察すると、SDカードにアクセスしはじめるときにクロックが出てきて、SDカードからのレスポンスが終わると、クロックが停止してしまうので、この信号を制御回路のクロックとして使うと、回路の動作も停止してしまって使いにくいからです。

その他、パソコン側にもテストプログラムを用意します。CRCの計算をさせて、シリアル波形と合ってるか、検証に使います。CRC計算は、ハードウエアで行うのは簡単な回路ですが、バイト単位のデータ列からいざ暗算となると、とても無理です。SDカード専用のロジック記録回路には、CRC回路も実装して、受信データとの比較を行います。また実際のSDカード制御に、このCRC回路を使うので、その検証目的もあります。

2、SDカード専用のロジック記録回路

このクロック立ち上がり抽出回路で得たCMDラインの信号をシフトレジスタに送ってパラレルに変換します。カードの初期化のときは、ACMD41が何回も出され、それに対してSDカードも返答しますから、16kB〜64kBにもなり、FPGA内のブロックRAMではとても記録しきれないので、SDRAMに記録します。ブロックRAMへの記録が512バイトを超えると、記録は続行しますが、先に記録した512バイトをSDRAMに吐き出します。このようにして、2KBのブロックRAMをリングバッファーとして動作させます。512バイトという長さにしたのは、カメラからの撮り込みデータを書く回路をそのまま使えるのと、SDカードの1セクタの長さに相当するので、ちょうどよいからです。
CMDラインを、ただ単に記録するだけなら、ロジックアナライザと同じく、あまり長時間の記録ができないので、CMDの始まりを検出して、そのあと48ビットまで記録するようにします。SDカードからのレスポンスも、立下りを検出して、48ビットか、136ビットまで記録します。このようにしてアイドル期間の記録を停止して、記録データ量を減らします。有効なビットの記録が済むと、内部のクロックカウンタ数も記録して、時間経過がわかるようにします。カウンタは、SDカードのクロック数のほか、内部で8MHzのカウンタを動作させ、その値もCMDラインの有効データの後に追加します。また、CMDラインには7ビットのCRC回路も動作させて、比較できるようにします。CRCの計算はハード的には非常に簡単です。こちらが、7ビットのCRC計算回路です。 1ビット入力と出力、そして7ビットの結果もパラレルで読み出せます。制御機能は、結果クリア、クロック有効、CRC演算有効の三つです。使いたいときまで結果クリアを1としておき、最初の有効ビットが入力されるときにクリアを0にします。結果の7ビットは、タイミングを見計らって読み出します。また、結果をシリアルで出す場合は、CRC演算有効をOFF(ロジック0)にして、クロックを有効にしたまま7回のクロックで全部出てきます。このとき、入力の値は無視します。これらの機能を入れた回路がこちらのSDロガー付H8全システム回路です。

3、専用のロジック記録回路で得たCMDの解析

解析に使ったSDカードは、Panasonic の256MのSDカードです。WindowsXPでFAT32でフォーマットしてあり、いくつかのファイルが書いてあります。このSDカードを、カードリーダに入れて、その初期化手順を記録したCMDログが、こちらのバイナリーデータです。このままでは判りにくいので、このバイナリーデータを解析するソフトで処理したものが、こちらです。解析するソフトはこちらの logckcrc.c です。記録したバイナリーデータを、cmdlog.bin とすると、コマンドプロンプトで、ligckcrc cmdlog.bin などと使います。 この記録から、SDカードは、以下の手順で操作されていることが判明しました。

CMD0 レスポンス無し
CMD1 レスポンス無し
CMD1 レスポンス無し
CMD1 レスポンス無し
CMD8 レスポンス無し
ACMD41 350回でREADYとなる
CMD2 CIDのレスポンス、120ビットの返答あり
CMD3 IDのレスポンス、ID、0x7F49を返答
CMD9 レスポンスあり。CMDのパラメターには、0x7F49を設定
CMD7 レスポンスあり。CMDのパラメターには、0x7F49を設定
CMD6 レスポンスあり。CMDのパラメターには、2を設定(データライン4ビットの指定)
ACMD51 レスポンスあり。
CMD18 レスポンスあり。READ MULTIPLEコマンド
CMD12 レスポンスあり。STOPコマンド
CMD18 レスポンスあり。READ MULTIPLEコマンド
CMD12 レスポンスあり。STOPコマンド
CMD18 レスポンスあり。READ MULTIPLEコマンド
CMD12 レスポンスあり。STOPコマンド
CMD18 レスポンスあり。READ MULTIPLEコマンド
CMD12 レスポンスあり。STOPコマンド
・・・・・・・・セクタのリードが続く。

この cmd15ck.txt で、どのようなCMDが出されたかの手順は判りますが、cmd15.bin には、時間経過の情報も記録していて、CMDとレスポンスの記録の後に、8MHzのカウンタの記録と、SDCLKの個数の記録を、1組で書いています。この情報から、CMDとレスポンスを記録した時点のカウンタ値を元に、CMDからレスポンスまでの時間が判り、且つ、SDCLKのクロック数が判ります。例として、CMD9から、レスポンスまでは、(バイナリ記録データから読む)

8MHzカウンタ(24ビット):  1A11B1   −−> 1A1D86 更新は 0xBD5
SDCLKカウンタ(28ビット): 00138D4  −−> 0013962 更新は 0x8E

という記録になっています。これは、8MHzで、(0x1D86−0x11B1=0xBD5) => 3029 カウント、378.62μ秒で、SDCLKは、0x8E(142個)あることになり、ここから、SDCLKは、約370KHzであることが判ります。CMD9の次に、CMD7を出して、レスポンスがありますが、このときの各カウンタは、

8MHzカウンタ(24ビット):  1A2333   −−> 1A2348 更新は 0x15
SDCLKカウンタ(28ビット): 0014551  −−> 0014587 更新は 0x36

となり、8MHzのクロックが21個カウントしている間に、SDCLKは、54個カウントしており、8MHz x 2.57倍で、約20MHzになります。これは、CMD9は、低速クロックで動作して、その後、CMD7は、20MHzの高速で動作していることになります。SDカードのクロック上限は、標準タイプで25MHzなので、それに近いクロックになっています。また、MMCカードのクロック上限は20MHzなので、このカードリーダは、MMCにも対応しているので、同じものを使っているようです。


4、128MBから16GBまでのSDカードを、専用のロジック記録回路で調査

専用のロジック記録回路で、カード挿入時のCMDとレスポンスの内容、1MBのファイルのリード、ライトなどをパソコンで操作した時のCMDとデータの内容をまとめたものが、以下の表1です。
ここで、
容量(CSD) は、CMD9コマンドのレスポンス、CSDのビットの意味から計算したもの。
CCC(CSD) は、CMD9コマンドのレスポンス、CSDのCCCフィールドの12ビット。( card command classes )
PSN は、CMD2コマンドのレスポンス、CIDの中の32ビット。( Product serial number )
これらの解析に使った参考資料はここからダウンロードできます Simplified Version of PHYSICAL LAYER SPEC
調査したSDカード
左から、@128MB、A256MB、B512MB、C1GB、D2GB、E4GB、F8GB、G16GB

表1 各SDカードの記録値
SD番号
容量(CSD)
CCC(CSD)
CMD8 応答
CMD6 発行
HC
read
write
ManufcturerID
メーカー(略号)
PSN
製造年月
@
125,440 kB
0x1B5
なし
なし
-
20 MHz
20 MHz
0x01
PA
616BB8CD
2008.4
A
244,224 kB
0x1B5
なし
なし
-
20 MHz
20 MHz
0x01
PA
68577F49
2008.4
B
489,960 kB
0x5F5
なし
あり
-
50 MHz
20 MHz
0x1D
AD
27104B10
2008.4
C
995,328 kB
0x5F5
あり
あり
-
50 MHz
20 MHz
0x27
PH
7C02EBB1
2007.10
D
1,993,728 kB
0x5F5
あり
あり
-
50 MHz
20 MHz
0x1B
SM
B193568A
2007.11
E
4,014,080 kB
0x5B5
あり
あり
HC
50 MHz
20 MHz
0x1B
SM
B122F6CF
2008.2
F
8,007,680 kB
0x5B5
あり
あり
HC
50 MHz
50 MHz
0x27
PH
B00006C8
2007.12
G
15,694,336 kB
0x5F5
あり
あり
HC
50 MHz
20 MHz
0x1D
AD
A0501340
2008.4

この表から読み取れるのは、CCC(CSD) のビットNo.10が0か1によって( 0x1B5 または 0x5B5(0x5F5) )、リード時の周波数が20MHzか、50MHzかの選択になっているのが判ります。また、このビットが CMD6 を発行しないか、するかの区別になっており、CMD6 を発行したものは、すべてCMDラインのレスポンスと、64バイトのデータレスポンスがあることが判っており、レスポンスの後、20MHzから50MHzにクロックが変わっていることも、調査で判りました。ここで不明なのは、Fの8GBだけ、ライト時も50MHzでデータ転送がされていることで、その区別は、どうやら CMD6 のデータレスポンスの特定のバイトの内容でされていることでした。このあたりの詳しい資料は、SDCARDアソシエーションの正規会員でないと参照できない資料に書かれているものと思われます。

以下は、解析結果をもとに試作した、SDカードコントローラの作成例です。マニュアルはまだありません。

SDカード制御回路一式。4ビットでリード、ライトします。転送は、SDRAMへDMAとなっています。ISE9.2回路プロジェクトソース
上記回路を制御する H83069F プログラム。Cygwin ソース一式。このプログラムには、下記のFatFs を使っていますが、テスト的に実装しているので、機能はあまりありません。実装しているのは、ロングネーム未対応のものです。イーサネットを使って、tftp でパソコンとのデータ転送ができます。
簡単な使い方。
HDM>mount SDカードのファイルシステムを有効にします。
SDFS-HDM>umount SDカードのファイルシステムを無効にします。
SDFS-HDM>lan LANを有効にして、パソコンとデータ転送できるようにします。パソコンから、tftp で制御します。

関連資料リンク ITU656規格の小型カラーカメラの画像を撮りこむ

リンク:
     秘蔵のテクニカルノート、FATファイルシステム  FATファイルシステムを公開しているサイトです(ロングネームに対応)
     ChaN のURL  MBM(パソコンのマルチブートマネージャーの作者)

連絡先: メール


inserted by FC2 system