2012-07-31 108 views
2

我一直在編程一個小AHCI驅動程序兩個星期。我已閱讀this articleIntel's Serial ATA Advanced Host Controller Interface (AHCI) 1.3.有一個示例,其中顯示瞭如何通過DMA模式(osdev.org)讀取扇區。我已經成功地做到了這一點操作(ATA_CMD_READ_DMA 0xC8),但是當我試着寫扇區(ATA_CMD_WRITE_DMA 0xCA)到設備中,HBA設置錯誤AHCI驅動程序爲自己的操作系統

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

(這是Intel AHCI規範解碼)。我不明白爲什麼發生。請幫幫我。

此外,我試圖發出命令IDENTIFY 0xEC,但沒有成功......

回答

7

你近兩個月前問這個問題,所以我不知道你是否已經想通了這出。請注意,我從記憶中寫出了必須首先完成的事情等。我可能沒有記得所有或準確地說明必須做什麼。你應該參考一切的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設備進行通信,我將從記憶中瞭解必須完成的事件。我可能沒有記得詳細。

我希望這可以幫助你。

相關問題