« RX62NでTCP/IPのプロトコルスタックを作ろう | トップページ | SATAのパケット解析 »

2011.08.27

SATAのコアを開発しています

4月ごろにちょっと始めたSATAのIPコアですが、本格的に開発することになりました。
納期は9月中旬だと思っていたのに、8月末になってしまいました。
というわけで突貫工事で開発中です。

今日は物理層がリンクアップするまでができました。

EXPARTAN-6Tには、ホスト用とデバイス用の2つのSATAコネクタがあります。
なので、IPコアもデバイスモード(ハードディスクをエミュレートするモード)とホストモード(マザーボードをエミュレートするモード)の両方を一緒に開発します。

IPコアをデバイスモードにし、パソコンのSATAコネクタにEXPARTAN-6Tのデバイス用のSATAコネクタをつなぎ、波形をキャプチャしてみました。

最初にデバイス初期化時の波形を見てみます。

まず、デバイス(EXPARTAN-6T)からCOMINITというリセット信号を送信し、ホストPCからのCOMWAKEを待ちます。その後、COMWAKEを送信します。
Devmode_init

そうしたらAlignプリミティブやSyncプリミティブを送信して、リンクアップ完了です。
Devmode_linkup_2

SATAでは32bit単位で送受信します。最初の1バイトがK符号ならばプリミティブといって制御用の符号になり、全部がD符号ならば純粋なデータとなります。
プリミティブには、
・ALIGN(K28.5 D10.2 D10.2 D27.3) クロック再同期や弾性バッファの調整に使われる
・SYNC(K28.3 D21.4 D21.5 D21.5) アイドル状態
・CONT(K28.3 D10.5 D25.4 D25.4) 直前のプリミティブを繰り返すときに使う
・X_RDY(K28.3 D21.5 D23.1 D23.1) フレーム送信の開始要求
・SOF(K28.3 D21.5 D23.2 D23.2) フレームの開始
など、全部で18種類ほどあります。
物理層で使うのはALIGNだけです。

次に、IPコアをホストモードにしたときの波形です。

EXPARTAN-6Tに、適当なハードディスクをつないで準備完了です。
デバイスからのCOMINIT(リセット要求)を受信したら、COMWAKEを送信します。デバイスから返事のCOMWAKEを受信したら、ALIGNプリミティブを待ちます。

Hostmode_init

リンクアップするときには、デバイス(ここではHDD)から、ALIGNプリミティブとSYNCプリミティブが送られてきます。その後、CONTプリミティブが送られてきます。

SATAでは同じ信号が連続して送られてEMI放射が増加することを嫌います。そのためデータにはスクランブルがかけられることになっていますが、プリミティブにはスクランブルがかけられないので、同じプリミティブを連続して送る場合にはCONTプリミティブとJunkデータを使って代替してもよいことになっています。

つまり、SYNC SYNC SYNC SYNC SYNC ・・・の代わりに、SYNC CONT Junk Junk Junk ・・・としてもよいということです。Junkデータにはスクランブルがかかるので、同じ符号が連続して送られることがなくなります。
ややこしいうえに、ユーザには特にメリットがない仕様です。

だからCONTが来たら直前のプリミティブの連続と解釈しなければなりません。

リンクアップしてしばらくすると、X_RDYというプリミティブとCONTが送られてきました。
Hostmode_xrdy

X_RDYは、「何か送りたいデータがあるんだけど」という意味です。これもCONTプリミティブを使っています。
これに対してホストがR_RDYで応答すれば、次のデータを送ってきてくれるようになるのでしょう。

SATAではハードディスクのほうからX_RDYを送ることで、最初の通信が始まるということがわかりました。ホストのほうからは特に何も送信しないようです。

|

« RX62NでTCP/IPのプロトコルスタックを作ろう | トップページ | SATAのパケット解析 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« RX62NでTCP/IPのプロトコルスタックを作ろう | トップページ | SATAのパケット解析 »