Aros/开发人员/文档/设备/ATA
ata.device 已重构并分离了总线访问代码。
对它们实施 HIDD API 会有益吗?它实际上允许用户构建自己的 ata.device 版本,并在运行时添加驱动程序。
当前代码将 EXECUTE DEVICE DIAGNOSTIC 单独发送到主设备和从设备(如果两者都存在)。仅当两个设备都是 PATA 硬盘时。ATAPI 在较早的时间进行检查,因此在这种情况下并不重要。
ATA 规范说
使用此接口的设备应由主机计算机编程以执行命令并在命令完成时向主机返回状态。当两个设备在接口上菊花链连接时,命令将并行写入两个设备,除了 EXECUTE DEVICE DIAGNOSTIC 命令外,只有选定的设备执行命令。两个设备都应执行 EXECUTE DEVICE DIAGNOSTIC 命令,无论选择哪个设备,设备 1 都应通过 PDIAG- 将其状态发布到设备 0。当设备控制寄存器中的 SRST 位设置为 1 时,两个设备都应执行软件复位协议。
代码要么缺少解释为什么以这种方式执行的注释,要么就是错误。这意味着两个设备都运行了 EXECUTE DEVICE DIAGNOSTIC 两次,这可能会导致检测代码出现问题。在 ATA 从设备完成(EXECUTE DEVICE DIAGNOSTIC 完成)之后,没有任何东西可以重新检查主设备的状态。如果它是比从设备慢的设备,它仍然可能正在执行此命令。
如果我正确理解 ATA 规范,主设备将等待从设备完成使用 /PDIAG 线,但当从设备完成时,主设备可能仍在执行诊断。我只运行它一次,而不是添加第二个测试。
总线探测代码仍然需要做一些工作 -
当前行为
- 创建传统端口列表
- 枚举 PCI 设备(从列表中删除已使用的传统端口)
- 添加剩余的传统端口。
正确行为
- 创建传统端口列表
- 枚举 PCI 设备(删除传统节点) - 并检查连接的单元
- 如果没有找到单元,则添加剩余的传统端口。
IDE 倍增器处理将仅在 m68k-amiga 平台文件中进行。
IDE 倍增器是一种设备,它将 IDE 总线数量增加一倍(从单个 IDE 总线获取两个独立的总线,两者都可以具有主设备和从设备)如果安装了 Amiga IDE 倍增器(即使没有驱动器连接到额外的 IDE 总线),IDE 检测将挂起。
IDE 倍增器接管第 3(位 2)IDE 地址线并将其用作 IDE 总线 0/1 选择线。(谁发明了这种黑客行为?)不幸的是,这也意味着 ATA 备用状态和设备控制寄存器将无法访问。目前,ata.device 需要两者。
我可以在 Amiga 特定代码中轻松地“模拟”这两个寄存器,只需要在通用中断处理程序中进行一些小的更改,但是“无备用状态/设备控制”处理应该在通用代码中吗?我的意思是,如果备用端口 == 0,是否使用备用方法?
还有其他平台使用过 IDE 倍增器吗?它不是 Amiga 特定的,但似乎它们只能与传统的仅 PIO 硬件一起使用。
据我所知,所有 FastATA 模型都带有包含自定义驱动程序的引导 ROM,不需要或不使用 ata.device。据报道,FastATA 引导 ROM 崩溃,原因不明。(可能需要 FastATA 扩展或 ROM 导出才能找到问题)。而且对于速度优化来说还为时过早(而且这个优化可能会引入新的兼容性问题)。这里是 FastATA 1200、4000 和 ZIV 的文档。
不幸的是,这也意味着 ATA 备用状态和设备控制寄存器将无法访问。目前,ata.device 需要两者。我可以在 Amiga 特定代码中轻松地“模拟”这两个寄存器,只需要在通用中断处理程序中进行一些小的更改,但是“无备用状态/设备控制”处理应该在通用代码中吗?我的意思是,如果备用端口 == 0,是否使用备用方法?
IDE 倍增器代码现在位于 Amiga 特定文件中(它甚至还没有在真实机器上进行测试,现在还没有任何类型的通用支持)。通用代码中唯一的变化是中断处理程序状态/备用状态重新排序。
据我所知,在这种情况下,您只需使用状态而不是备用状态。备用状态在我们的 ata.device 中使用,因为状态会重置中断状态,中断可能会丢失。在速度较慢的机器上偶尔会发生这种情况。因此,在状态的情况下,我们可以避免使用 IOAlt = IOBase 的“if”。是否可以对设备控制说同样的话?如果是这样,问题根本不存在。
还有其他平台使用过 IDE 倍增器吗?没有已知的。它不是 Amiga 特定的,但似乎它们只能与传统的仅 PIO 硬件一起使用。是的,DMA 是一个完全不同的东西。顺便说一句,我看到您在 Amiga 端口中将 dma 代码覆盖为 NOPs。这是否意味着 DMA 操作是总线特定的,应该移到总线驱动程序中?Amiga PCI 总线上的 DMA 与此代码有何不同?我真的想将这部分 HIDD 化。没有 Amiga IDE DMA 设备,从未有过,可能永远不会有。所有这些都是仅 PIO 的,即使是更新的第三方设备也是如此。这就是为什么我想摆脱“无用”的 DMA 代码的原因。
即使是 PCI 桥接板?据我所知,至少其中一些是支持 DMA 的?也许吧,但这个 ata.device 只处理 Gayle 兼容的 PIO-IDE。是否可以使用同一个 ata.device 处理 PCI 风格的自定义 IDE 端口? (从技术上讲,Gayle ata.device 应该被称为“scsi.device”,但也许没有人真的关心。我希望…)
我终于得到了一个 A4000,并注意到 ata.device 挂起了。配置是 CF 卡(8G SanDisk,主设备)和 Plextor PX-708A(从设备)。
出于某种未知的原因,ATA_EXECUTE_DIAG 会导致中断。(是的,nIEN 已设置!)根据 ATA 规范,这不应该发生,我检查了 ATA-1、ATA-2 和 ATA-7 规范。这会完全挂起机器,因为没有人可以清除中断。
因此,要么 ata_AltControl 在 A4000 上不起作用(但另一方面,如果我手动读取寄存器,ata_AltStatus 很明显可见),要么是 IDE 设备(或两者)有缺陷。
我可以通过在 ata_InitBus() 调用之前设置中断处理程序,并让 ata_HandleIRQ() 来清除虚假中断来轻松解决此问题。
我可以尽早(在 ata_RegisterBus 中,在 ata_InitBus() 之前)调用 bus->ab_Driver->CreateInterrupt(bus);还是有某种原因导致它在稍后调用?如果它破坏了其他平台,替代修复是什么?是否向 ata_BusDriver 结构添加 CreateInterruptEarly() 或其他类似的东西?
如果使用 IDE 倍增器,此修复也是必需的,因为它使 ata_AltControl 无法访问。也许这也可以解决其他报告的 IDE 检测挂起问题?我记得在论坛上看到过类似的东西。