我已经编程了两个星期的AHCI驱动程序。我读过this article和Intel's Serial ATA Advanced Host Controller Interface (AHCI) 1.3.有一个例子,它展示了如何通过DMA模式读取扇区(osdev.org)。我已成功完成此操作( ATA_CMD_READ_DMA 0xC8 ),但当我尝试将扇区( ATA_CMD_WRITE_DMA 0xCA )写入设备时,HBA设置错误
Offset 30h: PxSERR – Port x Serial ATA Error - Handshake Error
(这是从英特尔AHCI规范解码)。我不明白为什么会这样。求你帮帮我。
此外,我试图发出命令 IDENTIFY 0xEC ,但没有成功...
答案 0 :(得分: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(第35页& 36)。该值应与您开始时的值不同。我现在不记得你可以期待它们成为什么,但它们会有所不同。当实际建立通信时,设备向主机发送初始FIS。如果没有第一个FIS,HBA将无法与设备通信。 (这是第一个FIS,HBA在PxSIG中设置正确的位。)
最后,在完成所有这些之后,您需要设置PxCMD.FRE(第34页)。端口命令寄存器中的该位使FIS能够传送到器件。如果该位为低,HBA将忽略您发送给它的任何内容。
正如我在开始时所说,我不确定这是否会回答你的所有问题,但我希望它能让你走上正轨。我将从内存中了解必须完成的事件,以便有效地与SATA设备进行通信。我可能没有详细记得。
我希望这会对你有所帮助。