在研究前一篇文章的材料时,我想检查一个唯一兼容的ESDI控制器,我拥有西部数字WD1007V-SE2。我的董事会成立于1990年,固件是1989年,该控制员可能会在1988年由PCB上的版权日期判断。
此控制器没有真正的技术文档。也就是说,核心芯片,WD42C22A'Venus'是合理的记录,但这否则这一点非常有能力的芯片不做的是任务文件命令的过程。这完全由单独的微控制器/固件处理。
在正常情况下,我首先尝试从主机侧探测控制器,并查看它响应的命令,但没有功能的eSDI驱动器不是一个选项,并为智典价格找到工作的ESDI驱动器似乎是没有更长的可能。然后,逆向工程是。
运气将具有它,该控制器使用Intel 80C188 SoC运行固件,并且实际代码位于标准EPROM芯片上。所以我将固件芯片拉出来,将其突破到我的舞会读取器中,读出内容,并将结果文件加载到IDA中。
固件足够大但不是巨大的(16KB舞会,不满),所以它不需要我才能识别处理命令的调度表(实际上是两个)。我犹豫地说ATA命令,因为这显然不是IDE控制器,但寄存器和命令界面非常类似于ATA。
上面的命令名称与适用的ATA规范相同。其中一些命令保证仔细看看。
设置功能 - 功能寄存器必须包含AAH或55H;在响应中,命令分别启用或禁用重新提升。其他值导致命令失败。
设置多个模式 - 如果扇区计数寄存器中的值为零,则禁用读/写多倍。值1到14启用读/写多个。其他值原因设置多个模式失败;虽然ATA指定此禁用读/写多倍,但在这种情况下,WD1007V不会更改多模式设置。
eSDI命令 - 这显然不是ATA命令;实际上ATA说,E0H命令代码用于待机状态。此命令用于向连接的ESDI驱动器发送16位命令并获得16位响应。 WD1007V BIOS使用此命令非常一点。汽缸低/高寄存器用于输入和输出,但具有字节交换(16位命令字/结果的低字节是圆柱高寄存器)。至少一些SMS OMTI ESDI控制器也支持此命令。
A0H,ADH - ATA中不存在这些命令(A0H命令代码稍后用于为ATAPI设备设计的分组命令)。我不知道这些命令做了什么,但他们确实与驱动器进行通信。格式化时,WD1007V BIOS使用A0H命令。这些命令可能正在驱动器上访问某种服务圆柱。
识别 - 此命令返回一个令人惊讶的大小的ATA定义版本的子集。前10个单词只是ESDI驱动器本身通过Request Configuration命令返回的内容。序列号是所有零,它们非常有趣 - 显然控制器无法提供驱动程序序列号,但困扰提供一种如此如上所述的东西。固件修订版是'Rev。 A5'和型号'WD1007V'。固件还填充缓冲类型和大小(32KB),ECC长度(4或7个字节,根据跳线设置),以及当前多模式设置。
识别缓冲区的最后一个单词用于报告控制器的当前跳线设置。我被告知这是最初在康复发现的深夜构建中无意中留下的调试 - 唯一的功能,并要求作为永久性功能。
总而言之,WD1007V固件主要是ATA命令集兼容,并包括磁盘命令集的基本增强功能:识别,读/写缓冲区,读/写多倍并设置多个,以及集合要启用/禁用预读。