你近兩個月前問這個問題,所以我不知道你是否已經想通了這出。請注意,我從記憶中寫出了必須首先完成的事情等。我可能沒有記得所有或準確地說明必須做什麼。你應該參考一切的AHCI規範。這樣做的方法與有這樣做的程序員差異很大。出於這個原因,我不包括代碼示例。
對於初學者,請確保已經相應地設置了HBA狀態機。您將能夠在相同的SATA規範1.3中找到HBA支持的狀態機的參考。代替這個,你應該檢查一些寄存器。
請注意,所有頁碼給出關於查看在Adobe Acrobat和8頁超過實際的文檔
第24頁和規格的25號,檢查GHC .IE和GHC.AE.這兩個將打開中斷並確保HBA在AHCI模式下工作。另一個非常重要的檢查寄存器是CAP.SSS(頁23)。如果這個位很高,那麼HBA支持交錯旋轉。這意味着HBA不會爲任何端口執行任何協議協商。在執行以下操作之前,請存儲PxSIG的值(頁35和36)。
要真正旋轉端口,您需要訪問規範的第33,34和35頁。這些頁面覆蓋了PxCMD寄存器。對於HBA支持的每個端口(檢查CAP.NP知道有多少個端口),您必須切換高位PxCMD.SUD。將該位置高後,您需要輪詢PxSSTS(頁36)以檢查PHY的狀態。您可以檢查CAP.ISS,以瞭解您可以預期在PxSSTS上看到「活躍」的速度。
旋轉端口後,檢查PxSIG(Page 35 & 36)。該值應該與開始時的值不同。我現在不記得你可以期望他們成爲什麼樣的人,但他們會有所不同。當通信實際建立時,設備向主機發送初始FIS。如果沒有第一個FIS,HBA將無法與設備通信。 (這是第一個FIS,HBA在PxSIG中設置了正確的位)。
最後,在完成所有這些之後,您需要設置PxCMD.FRE(第34頁)。端口命令寄存器中的該位使FIS能夠傳送到設備。如果此位較低,HBA將忽略發送給它的任何內容。
正如我在開始時所說的,我不確定這是否會回答您的所有問題,但我希望它能讓您走上正確的軌道。爲了有效地與SATA設備進行通信,我將從記憶中瞭解必須完成的事件。我可能沒有記得詳細。
我希望這可以幫助你。