我想解决硬盘驱动器的磁柱问题,但我找不到 IDE 接口引脚分布的良好手册。有人知道怎么做吗?
我不想在磁盘上读取/写入任何内容,只想移动臂穿过圆柱体。我想通过连接接口上的一些电线并发送一些信号来实现这一点。
答案1
我的一个同事正在玩一种黑客技术,他使用旧软盘驱动器中的步进电机来制作音乐......有点令人着迷。
我在这里找到了一个关于访问软盘上电机的基础知识的网站: http://www.epanorama.net/circuits/diskstepper.html
但是,我觉得 IDE 类型的驱动器不太可能实现类似的直接电机访问... 现代(MFM 之后)硬盘驱动器已经严重抽象了对物理硬件的控制,即使是最低级别的 API 调用也是如此。我不确定您想要做的事情是否可行,不过您可以向 grc.com 的 Steve Gibson 发送电子邮件。
答案2
你可以找到一些有趣的东西,例如装配艺术:第十三章
下列的13.2.5 INT 13h——低级磁盘服务你可以考虑使用int 13h
int 13h 函数为 PC 程序提供了几种不同的低级磁盘服务:重置软盘系统、获取软盘状态、读取软盘扇区、写入软盘扇区、验证软盘扇区、格式化软盘磁道等等。
从部分一些常见的磁盘子系统 BIOS 调用:
啊=0Ch
输入参数:与上面的 (4) 相同,只是不需要扇区
输出参数:与上面的 (4) 相同 将磁盘头发送到磁盘上的指定磁道。
说明:将磁盘头移至磁盘上的指定磁道。
对于 IDE 引脚排列...这是从谷歌搜索中得到的第一张图片“IDE 引脚排列”:
答案3
IDE(实际上是并行 ATA)接口在 Wikipedia 文章(“并行 ATA”)中有详细描述。从那里您可以找到实际规格的链接。旧版本的规格都可以免费下载(或者说,上次我检查时是这样的)。
不过,DigitalSorceress 是正确的:连接器上没有引脚可以简单直接地指示驱动器移动臂。(即使是软盘驱动器接口也不是那么容易。)IDE 驱动器最初设计用于直接连接到 IBM PC AT 中的 16 位 ISA 总线。驱动器解码许多可由 CPU 寻址的 I/O“端口”。驱动器将这些解释为“寄存器”。您使用命令的参数加载各种寄存器,然后将命令写入命令寄存器。(您可以通过将 ISA 总线协议告诉 IDE 驱动器上的引脚来实现这一点。)然后通过读回一些相同的寄存器来检查状态。
其中两个寄存器确实指定了气缸号,但仅仅将气缸号输入到其中是不够的,将气缸号输入到其中也不仅仅是在引脚上施加一些电压的问题。
如果您考虑将驱动器连接到 Arduino 或其他东西(我认为它必须是 Mega 之类的东西才能获得足够的引脚),那么您可能可以通过大量编程来移动磁头。请记住,在这种情况下,您不仅要实现 PATA 协议,还要在代码中运行 ISA 协议。这并不复杂,但所有这些都加起来了,我不知道 Arduino 的速度是否足够快,可以满足总线上的时序要求。
只需将驱动器连接到旧 PC 上,就会简单得多。然后,您可以编写一些汇编代码,从 BIOS 中调用 INT 函数来访问磁盘上的各个块,正如 Hastur 所建议的那样。
或者您可以将其连接到 PATA 转 USB 适配器并从较新的 PC 上运行它。编写一个与未格式化的硬盘(即没有可识别文件系统的硬盘)对话的程序并不难。
另一个复杂因素是,我们实际上不再按柱面/磁头/扇区来寻址硬盘。我们只使用 LBA - 逻辑块地址。这些地址从 0 开始,线性增加到 n-1。驱动器担心这些地址如何映射到 C/H/S 位置。这种映射并不简单,因为在现代驱动器中,每个磁道的扇区数从外柱面变为内柱面。坦率地说,我不知道现代驱动器是否还能接受 C/H/S 寻址。当然,如果您只是向驱动器发送一系列增加的 LBA,当您碰巧跨越柱面边界时,臂会不时移动。
答案4
如果您从驱动器本身移除(或绕过)IDE 控制器板,您可能能够使用微控制器模拟定位臂所需的信号。这将非常依赖于您使用的特定驱动器,但不会受到现代驱动器控制抽象的限制。控制器上可能还存在一些可以“戳”的点,以产生一些有趣的行为。祝你好运。(: