gpt4 book ai didi

drivers - 适用于自己操作系统的 AHCI 驱动程序

转载 作者:行者123 更新时间:2023-12-02 15:46:38 28 4
gpt4 key购买 nike

我已经编写一个小型 AHCI 驱动程序两周了。我已阅读this articleIntel'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

(这是根据 Intel AHCI 规范进行的解码)。我不明白为什么会这样。请帮助我。

此外,我尝试发出命令IDENTIFY 0xEC,但没有成功...

最佳答案

您在大约两个月前提出了这个问题,所以我不确定您是否已经弄清楚了。请注意,我是根据必须先做什么等内容凭内存写的。我可能没有记住全部或准确地记住必须做什么。您应该引用 AHCI 规范的所有内容。执行此操作的方法因执行此操作的程序员而异。因此,我不包含代码示例。

对于初学者,请确保您已相应地设置 HBA 状态机。您将能够在同一 SATA 规范 1.3 中找到 HBA 支持的状态机的引用。相反,您应该检查一些寄存器。

请注意,所有页码都是在 Adob​​e Acrobat 中查看时给出的,比实际文档中的页码多 8 页

从规范的第 24 页和第 25 页,检查 GHC.IE 和 GHC.AE。这两个将打开中断并确保HBA工作在AHCI模式。另一个需要检查的非常重要的寄存器是 CAP.SSS(第 23 页)。如果该位为高电平,则 HBA 支持交错旋转。这意味着HBA不会对任何端口执行任何协议(protocol)协商。在执行以下操作之前,请存储 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 设备通信而必须完成的事件。我可能记不太清楚了。

希望这对您有帮助。

关于drivers - 适用于自己操作系统的 AHCI 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739979/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com