SATAのIPコアでHDDのDevice IDの取得に成功
SATAのIPコアの開発をはじめて、もう6日になります。
ようやくHDDのDevice IDが読めるようになりました。
こうやってEXPARTAN-6TのSATAコネクタとHDDとをつないで実験しています。
リンク層が送受信ともにできたので、適当なパケット(フレーム)を送ってみました。
まずは、ハードディスクとのリンクアップした後に、デバイスから最初に送ってくるフレーム「34005001 01000000・・・」というものです。これは、デバイスの初期化が完了して、TFR(ATAのレジスタ)やステータスをホストに送ってきているものです。これを、そっくりそのままデバイスに送ることにしました。すると・・
このフレームのCRCは正しいはずなのですが、R_ERRが返ってきてしまって、正しく受け入れられていないことがわかります。それもそのはず、先頭の「34」というのは、デバイス→ホスト方向の転送のタイプを示すためです。
おそらく相手側のリンク層はよくても、トランスポート層ではじかれてエラーとなったのでしょう。
次に、ホスト→デバイス方向の正しいフレームを送ってやります。すると、
おおっ、ちゃんとR_OKが帰ってきました。受け入れられるのって何だか嬉しい!
フレームのエラーチェックは、リンク層だけではなくトランスポート層でも判断しているのですね。しかし、どちらの層でエラーとなっても返るのはR_ERRですから、SATAというのはシンプルなプロトコルです。
フレームがちゃんと相手に伝わっていることがわかったので、つないだハードディスクに対してIDENTIFY DEVICEコマンドを発行してみました。すると、見事にDevice IDが取得できました。
送信したフレームの中身は、2780EC00 00000000 00000000 00000000 00000000というものです。
27はホスト→デバイス方向の転送を示し、80はコマンドを与えることを示し、ECはIDENTIFY DEVICEのコマンドです。
帰ってきたフレームは2つありました。最初に「PIO setup Device to Host」というフレームが来て、次に「Data Device to Host」というのが来ました。PIO setup Device to Hostは「これからデータを送るよ、長さは○○バイトだよ」と知らせてくるものです。
setup のフレームの中身は、5F605800 00000000 00000000 00000050 00020000でした。これは512バイトの後続データがあることを意味します。
Data Device to Hostフレームの中身は、46000000 5A0CFF3F 37C81000 00000000 3F000000 00000000 20202020 20202020 20202020 56393453 31563953 00000000 04004343 48312020 20205453 31333035 33303134 53412020 20202020 20202020 20202020 20202020 20202020 20202020 00001080 0000002F
・・・(略)
というものでした。
手作業で解読すると、
・論理シリンダ数=16383
・論理ヘッド数=16
・論理セクタ数=63
・シリアル番号 9V34V139
・ファームウェアのバージョン="CC1H "
・型番 ST31500341AS
となっていました。
(ちなみに、実験に使っているHDDはSeagate社のBarracuda 7200.11。特定のファームウェアに致命的な不具合があって突然壊れるといういわくつきのもの。まぁ、怖くて使えないジャンクHDDですわな。)
正しくよめているようです。
ここまで動いたので、ひとまず安心です。
最近のコメント