簡體   English   中英

什么是 PATA/IDE 狀態代碼,它們是什么意思?

[英]What are the PATA/IDE status codes, and what do they mean?

我正在編寫一個有趣的操作系統,我正在嘗試編寫一個 PATA/IDE 驅動程序來訪問磁盤,但是它不起作用。 我有這一行unsigned char status = port_byte_in(ATAPort + COMMANDPORT); 它返回值 88(十進制)。 由於這可能表明我做錯了什么,並且作為其他人的參考,PATA/IDE 狀態代碼是什么?

我的驅動程序遵循28 位 PIO PATA/IDE 進程。

編輯 - 澄清一下,這是port_byte_in中的 port_byte_in:

unsigned char port_byte_in(unsigned short port) {
    unsigned char result;
    __asm__("in %%dx, %%al" : "=a" (result) : "d" (port));
    return result;
}

ATAPort0x1F0 , COMMANDPORT = 0x07

在您考慮為任何類型的設備編寫設備驅動程序之前,您需要查找/下載並閱讀該設備的所有相關規范(您不應依賴陌生人的部分異端邪說)。

大多數相關規范是由 T13 工作組創建的 ANSI 標准; 可以在此處找到它們的列表: http://www.t13.org/Standards/Default.aspx?DocumentType=3

不幸的是,它們不是免費的(您應該為副本支付 ANSI 費用,因為從事不再具有商業相關性的東西的無償業余程序員會得到與制造硬件以營利的公司相同的待遇 (.) )。 幸運的是,web 搜索(從 T13 列表中搜索文檔的標題)通常會找到與最終標准幾乎相同的草稿版本。

有許多(八個?)版本的“AT Attachment”規范(加上您還需要的其他規范)。 您所說的寄存器是 IDE/ATA 控制器的狀態寄存器,並在這些規范中定義。 在不同版本的規范中,狀態寄存器位的一些定義已經改變(變成“取決於命令”或“過時”); 並且“取決於命令”(對於狀態寄存器的第 4 位)聽起來像 - 該位的含義取決於您最后給 controller 發出的命令。

布倫丹的回答提出了一些很好的觀點。 另外,請注意從命令寄存器讀取實際上是從狀態寄存器讀取。 命令寄存器是只寫的,而從同一地址讀取是從狀態寄存器讀取。 然后,如果該寄存器顯示 controller 忙,第 7 位設置,則從狀態寄存器讀取可能並且可能返回未定義的結果。

返回值 88d (0x58) 是狀態寄存器的一個非常常見的返回值。 這顯示為:01011000b

bit 7 = 0 = not busy
bit 6 = 1 = Drive is ready
bit 5 = x = command specific
bit 4 = x = command specific
bit 3 = 1 = Data Request
bit 2 = 0 = obsolete (command specific)
bit 1 = 0 = obsolete (command specific)
bit 0 = 0 = no error

考慮到這一點,請注意第 3 位已設置。 這意味着控制器/驅動器已准備好/期待數據傳輸,具體取決於發送的命令。

例如,如果您發送了 READ 命令,則該位表示您已准備好從數據寄存器中讀取(假設您正在使用 PIO)。 如果您正在讀取字(16 位值),您應該讀取數據寄存器 256 次,該位將被清除。

請注意,如果您一次讀取多個扇區,則在讀取每個扇區后都會收到一個中斷,無論您正在讀取多少個扇區,並且將再次為下一個扇區設置 DRQ 位(位 3) .

對於寫操作,DRQ 位指示驅動器已准備好進行寫操作。 即:將一個 16 位字寫入 DATA 寄存器。

32 位讀取和寫入是相同的,盡管您只傳輸 128 個字而不是 256 個字。

此外,從狀態寄存器讀取會清除命令的中斷狀態,向 controller 指示可以啟動下一個命令。 有時這不是本意。 因此,controller 有一個 ALT STATUS 寄存器,它返回完全相同的結果而不清除中斷狀態。 您應該從中讀取,直到您准備好清除中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM