我已经编程了两个星期的AHCI驱动程序.我已经阅读了本文和英特尔的串行ATA高级主机控制器接口(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
Run Code Online (Sandbox Code Playgroud)
(这是从英特尔AHCI规范解码).我不明白为什么会这样.请帮我.
另外,我试图发出命令IDENTIFY 0xEC,但没有成功...
你差不多两个月前问了这个问题,所以我不确定你是否已经弄明白了.请注意,我是从记忆中写下的,必须先做什么,等等.我可能没有记住所有,或准确地说,必须要做的事情.你应该参考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设备进行通信.我可能没有详细记得.
我希望这可以帮助你.