PATA/IDE 状态代码是什么,它们的含义是什么?

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

我写一个 OS 是为了好玩,我正在尝试写一个 PATA/IDE driver 来访问磁盘,但是它不起作用。我有这一行 unsigned char status = port_byte_in(ATAPort + COMMANDPORT); 其中 returns 的值为 88(十进制)。由于这可能表明我做错了什么,并作为其他人的参考,PATA/IDE 状态代码是什么?

我的 driver 遵循 28 bit PIO PATA/IDE 流程。

编辑 - 澄清一下,这里是 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

在考虑为任何类型的设备编写设备 driver 之前,您需要 find/download 并阅读该设备的所有相关规范(您不应该依赖陌生人的部分异端邪说).

大多数相关规范都是由 T13 工作组创建的 ANSI 标准;可以在此处找到它们的列表:http://www.t13.org/Standards/Default.aspx?DocumentType=3

不幸的是,它们不是免费的(您应该为副本支付 ANSI 费用,因为从事不再具有商业相关性的东西的无偿爱好者程序员与制造硬件以牟利的公司一样受到对待(!))。幸运的是,网络搜索(从 T13 列表中搜索文档的标题)通常会找到与最终标准几乎相同的草稿版本。

"AT Attachment" 规范有很多(八个?)版本(加上您还需要的其他规范)。您所说的寄存器是 IDE/ATA 控制器的状态寄存器,并在这些规范中定义。状态寄存器位的一些定义在不同版本的规范中发生了变化(变为 "depends on command" 或 "obsolete"); "depends on command"(状态寄存器的第 4 位)听起来像 - 该位的含义取决于您最后给控制器的命令。

提出了一些很好的观点。另外请注意,从命令寄存器读取实际上是从状态寄存器读取。命令寄存器是只写的,而从同一地址读取是从状态寄存器读取。然后,如果该寄存器显示控制器正忙,则设置第 7 位,从状态寄存器读取可能 return 未定义的结果。

A return 值 88d (0x58) 是一个非常常见的 return 状态寄存器。这显示为: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 位已设置。这意味着 controller/drive 已准备好 for/expecting 数据传输,具体取决于发送的命令。

例如,如果您发送了 READ 命令,则该位表示您已准备好从数据寄存器读取数据(假设您使用的是 PIO)。如果你正在读取字(16位值),你应该读取数据寄存器256次,这个位将被清除。

请注意,如果您一次读取多个扇区,则无论您读取多少个扇区,您都会在读取每个扇区后收到一个中断,并且 DRQ 位(位 3)将再次为下一个扇区设置。

对于写入,DRQ 位表示驱动器已准备好写入。即:将一个 16 位字写入 DATA 寄存器。

32 位读取和写入是相同的,尽管您只传输 128 个字而不是 256 个字。

此外,从状态寄存器读取会清除命令的中断状态,向控制器指示可以启动下一个命令。有时这不是本意。因此,控制器有一个 ALT STATUS 寄存器,它 return 在不清除中断状态的情况下得到完全相同的结果。在您准备好清除中断之前,您应该一直读取它。