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



我写操作系统是为了好玩,我试图写一个PATA/IDE驱动程序来访问磁盘,但它不起作用。我有一行unsigned char status = port_byte_in(ATAPort + COMMANDPORT);,它返回88(十进制(的值。由于这可能表明我做错了什么,作为其他人的参考,PATA/IDE状态代码是什么?

我的驱动程序遵循28位PIO PATA/IDE过程。

EDIT-为了澄清,这里有port_byte_in函数:

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

并且ATAPort0x1F0COMMANDPORT=0x07

在考虑为任何类型的设备编写设备驱动程序之前,您需要找到/下载并阅读该设备的所有相关规范(您不应该依赖陌生人的部分异端(。

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

不幸的是,它们不是免费的(你应该向ANSI支付副本的费用,因为从事不再具有商业相关性的东西的无报酬业余程序员会得到与制造盈利硬件的公司相同的待遇(!((。幸运的是,网络搜索(从T13列表中搜索文档的标题(通常会发现与最终标准几乎相同的草案版本。

有许多(八?(版本的"AT附件"规格(加上您还需要的其他规格(。您所说的寄存器是IDE/ATA控制器的状态寄存器,它是在这些规范中定义的。在不同版本的规范中,状态寄存器位的一些定义发生了变化(变得"取决于命令"或"过时"(;"取决于命令"(对于状态寄存器的第4位(是它听起来的样子——该位的含义取决于你最后给控制器的命令。

Brendan的回答提出了一些很好的观点。此外,请注意,从命令寄存器读取实际上是从状态寄存器读取。当从同一地址读取是从状态寄存器读取时,命令寄存器仅为写入。然后,如果该寄存器显示控制器正忙,则设置位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个字。

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

相关内容

最新更新