3

私は小さな AHCI ドライバーを 2 週間プログラミングしてきました。この記事Intel の Serial ATA Advanced Host Controller Interface (AHCI) 1.3を読みました。DMA モード (osdev.org) を介してセクターを読み取る方法を示す例があります。この操作 ( ATA_CMD_READ_DMA 0xC8 ) は正常に完了しましたが、セクター ( ATA_CMD_WRITE_DMA 0xCA ) をデバイスに書き込もうとすると、HBA がエラーを設定しました。

Offset 30h: PxSERR – Port x Serial ATA Error - Handshake Error

(これは Intel AHCI 仕様からのデコードです)。なぜそれが起こったのか分かりません。私を助けてください。

さらに、コマンドIDENTIFY 0xECを発行しようとしましたが、成功しませんでした...

4

1 に答える 1

9

あなたがこの質問をしたのはほぼ 2 か月前なので、あなたがすでにこれを理解しているかどうかはわかりません。最初に何をしなければならないかなどの点で、私は記憶から書いていることに注意してください。何をしなければならないかをすべて、または正確に覚えていない可能性があります。すべてについて AHCI 仕様を参照する必要があります。これを行う方法は、これを行ったプログラマーがいるのと同じくらい多様です。このため、コード例は含めません。

まず、HBA ステート マシンが適切に設定されていることを確認します。同じ SATA 仕様 1.3 の HBA でサポートされているステート マシンのリファレンスを見つけることができます。その代わりに、いくつかのレジスタをチェックする必要があります。

すべてのページ番号は、Adobe Acrobat での表示に関して与えられており、実際のドキュメントで番号が付けられているよりも 8 ページ多いことに注意してください。

仕様の 24 ページと 25 ページから、GHC.IE と GHC.AE を確認します。これら 2 つは割り込みをオンにし、HBA が AHCI モードで動作していることを確認します。チェックすべきもう 1 つの非常に重要なレジスタは、CAP.SSS (ページ 23) です。このビットがハイの場合、HBA は時差スピンアップをサポートしています。これは、HBA がどのポートに対してもプロトコル ネゴシエーションを実行しないことを意味します。次の操作を行う前に、PxSIG の値を保存してください (35 ページと 36 ページ)。

ポートを実際に起動するには、仕様の 33、34、35 ページにアクセスする必要があります。これらのページでは、PxCMD レジスタについて説明します。HBA でサポートされている各ポート (CAP.NP をチェックして、そこにあるポートの数を確認してください) ごとに、上位ビットの PxCMD.SUD を切り替える必要があります。そのビットをハイに切り替えた後、PHY の状態を確認するために PxSSTS (ページ 36) をポーリングする必要があります。CAP.ISS をチェックして、PxSSTS で「生き返る」ことが期待できる速度を知ることができます。

ポートをスピンアップした後、PxSIG (ページ 35 & 36) を確認します。値は、開始時とは異なるはずです。彼らが何になると期待できるかは今思い出せませんが、彼らは違うでしょう。通信が実際に確立されると、デバイスはホストに初期 FIS を送信します。この最初の FIS がないと、HBA はデバイスと通信できません。(HBA が PxSIG に正しいビットを設定するのは、この最初の FIS です。)

最後に、このすべての後、PxCMD.FRE を設定する必要があります (34 ページ)。ポート コマンド レジスタのこのビットは、デバイスへの FIS 配信を有効にします。このビットが低い場合、HBA は送信されたものをすべて無視します。

最初に言ったように、これがあなたの質問のすべてに答えるかどうかはわかりませんが、あなたが正しい方向に進むことを願っています. SATA デバイスと効果的に通信するために実行する必要があるイベントについて、記憶から探しています。あまり詳しく覚えていないかもしれません。

これがお役に立てば幸いです。

于 2012-09-12T03:33:42.047 に答える