AHCI sata裝置初始化流程

2021-08-22 00:21:58 字數 967 閱讀 8775

檢測sata裝置:

檢測hba的存在

根據hba的port挨個檢測是否連線。根據intel文件,需要檢測的項有:pxssts.det=03h,pxssts.ipm=02h或06h

檢測signature,0101的就是sata了

初始化sata裝置:

關閉指令執行。設定pxcmd.st=0,pxcmd.fre=0。

將command list重新定位。要注意:command list對齊是1k的,received fis是256對齊,command table則是128對齊。由於command table的長度是128+16*n,n是prdt的項數。所以,一般來說,n應取8的倍數。尤其需要注意的是,每個prdt雖然可以支援4mb,但sata標準對dma讀取最大只支援8k,因此若你需要使用dma一次讀取很多扇區,則用於command list的儲存空間會相當的大。

啟用指令執行。設定pxcmd.fre=1,pxcmd.st=1。

讀取/寫入sata裝置

通過pxsaac和pxci找到空閒的command slot。

將這個slot的prdt順序指向緩衝區,注意設定每個prdt的byte count,這是從0開始的,0表示1。

設定command header的prdtl,注意這是從1開始的,1表示1。根據讀取/寫入設定command header的w。

設定command header的fis為h2d register fis。視乎所用的具體指令,設定fis的command和c。設定起始扇區和操作扇區數,具體參考sata標準。注意不同的fis,對不同欄位的使用方式不同。

先設定pxsaac,然後設定pxci,讓hba開始傳輸指令。

檢測pxsaac,看這個slot是否空閒。如果空閒,則說明傳輸已經完成。檢視各個錯誤暫存器,是否有錯誤發生。

總體來說,初始化過程非常麻煩,而且8k的讀取限制對prdt的記憶體需求太高。但使用起來並不麻煩。另外,無法得知裝置的扇區大小,只能假定為512位元組。

初始化 鍵盤裝置

1 bool initinput hwnd hwnd 216 第二步 建立裝置,滑鼠,鍵盤等。17 res pinput createdevice 18 guid syskeyboard,裝置的guid,這裡使用定義好的 19 pkeyboard,裝置指標 20null 21if succeeded...

MTK Phonebook初始化流程

開機之後,初始化時,設定如下三個ps訊息cback函式 initializeall mmi phb init protocol setprotocoleventhandler mmi phb ind startup finish,prt phb startup finish ind setproto...

SD初始化流程

sd初始化流程 當host上電後,使所有的卡裝置處於卡識別模式,完成設定有效操作電壓範圍,卡識別和請求卡相對位址等操作。1 傳送指令cmd0使卡裝置處於idle狀態 2 傳送指令cmd8,如果卡裝置有response,說明此卡為sd2.0以上 3 傳送指令cmd55 acmd41,該指令是用來探測卡...