ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Amiga Buddha 与 Catweasel IDE 控制器寄存器映射全解析:从 Zorro-II 硬件规格到 Linux PATA 驱动实现

Amiga Buddha 与 Catweasel IDE 控制器寄存器映射全解析:从 Zorro-II 硬件规格到 Linux PATA 驱动实现 Amiga Buddha 与 Catweasel IDE 控制器寄存器映射全解析从 Zorro-II 硬件规格到 Linux PATA 驱动实现【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本篇技术指南以 Linux 内核 Documentation/arch/m68k/buddha-driver.rst 为骨架完整讲解 Amiga Buddha及 Catweasel Zorro-II 版IDE 控制器的寄存器映射、Autoconfiguration 流程、速度寄存器时序表与 IRQ 机制并结合内核源码 drivers/ata/pata_buddha.c 展示这套 1997 年的硬件规格如何在现代 libata 框架下落地。读完你将掌握该控制器的底层寻址规则、ATAPI 命令访问时序选择依据以及内核中对应驱动的注册与端口初始化方式。一、背景Buddha 与 Catweasel 在 m68k 体系中的位置Buddha 是个体计算机公司Individual Computers厂商号 0x1212为 Amiga 推出的 Zorro-II 扩展板卡提供 IDE 接口用于挂接硬盘与 CD-ROMCatweasel Zorro-II 版本则是其衍生板卡额外提供第三个 IDE 端口。Linux 内核的 Amiga Buddha 与 Catweasel IDE 驱动由 Geert Uytterhoeven 编写其寄存器规格说明出自 Jens Schönfeld1997 年 2 月 19 日撰写同年 5 月 27 日更新即本仓库 buddha-driver.rst 所保存的原始文档。在内核侧该控制器的现代实现是 libata 驱动 drivers/ata/pata_buddha.c其文件头注释明确标注了演进关系当前版本基于 1997/2001 年的buddha.c作者 Geert Uytterhoeven 等人2018 年由三星电子重构为基于 libata 的pata_buddha驱动同时支持 Buddha、Catweasel 与 X-Surf 三类板卡DRV_NAME pata_buddhaDRV_VERSION 0.1.1。Zorro 厂商与产品 ID 定义在 include/uapi/linux/zorro_ids.h#define ZORRO_MANUF_INDIVIDUAL_COMPUTERS 0x1212 #define ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA ZORRO_ID(INDIVIDUAL_COMPUTERS, 0x00, 0) #define ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF ZORRO_ID(INDIVIDUAL_COMPUTERS, 0x17, 0) #define ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL ZORRO_ID(INDIVIDUAL_COMPUTERS, 0x2A, 0)注意其中 Catweasel 的产品号 0x2A 正是十进制 42与规格文档中product number: 042 for Catweasel Z-II的记载完全吻合。二、Autoconfiguration板卡如何被 Zorro-II 总线识别Buddha 的 Autoconfiguration 完全按照 Commodore 官方手册实现没有使用任何取巧手段例如从地址方程中省略某些地址线。文档给出的配置信息如下属性值Vendor number4626$1212Product number0Catweasel Z-II 为 42Serial number0Rom-vector$1000板卡类型声明为Z-II 板、容量 64K、不放入 freemem 列表、Rom-Vector 有效、同一卡上无第二个 Autoconfig 板、无空间偏好、支持 Shutup_forever。在 Linux 中驱动通过 Zorro 设备 ID 表与板卡绑定见 drivers/ata/pata_buddha.cstatic const struct zorro_device_id pata_buddha_zorro_tbl[] { { .id ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA, .driver_data BOARD_BUDDHA }, { .id ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL, .driver_data BOARD_CATWEASEL }, { } }; MODULE_DEVICE_TABLE(zorro, pata_buddha_zorro_tbl);驱动以zorro_driver形式通过 zorro_register_driver() 注册probe回调在 Zorro 总线枚举出匹配板卡时被调用。X-Surf 因与 zorro8390 网络驱动竞争 modalias采用late_initcall手动绑定见 pata_buddha_late_initBuddha 与 Catweasel 则走常规自动绑定路径。三、基地址设置$4a 先行、$48 殿后的两步握手基地址设置必须分两步完成与 Amiga Kickstart 的做法一致将 8 位地址的低半个字节写入 $4a再将完整字节写入 $48。写入 $4a 的次数无关紧要只要 $48 未被触碰即可一旦 $48 被写入整块板卡就从 $e8 消失并映射到刚写入的新地址。文档特别强调必须确保先写 $4a 再写 $48否则找到板卡的概率只有 1:16。值得注意的是即使板卡映射到 $e8其本地内存映射local memory-map依然生效这是后续所有寄存器访问的基础。四、本地内存映射表从 Autoconfig 空间到 IDE-Select 窗口板卡的本地内存映射是驱动访问所有功能的核心依据完整映射如下地址范围功能说明$0-$7eAutoconfig 空间见 Z-II 文档$80-$7fd保留$7fe速度选择寄存器Speed-select Register可读可写详见下文$800-$8ffIDE-Select 0Port 0寄存器组 0$900-$9ffIDE-Select 1Port 0寄存器组 1$a00-$affIDE-Select 2Port 1寄存器组 0$b00-$bffIDE-Select 3Port 1寄存器组 1$c00-$cffIDE-Select 4Port 2寄存器组 0Catweasel 独有$d00-$dffIDE-Select 5Port 3寄存器组 1Catweasel 独有$e00-$eff本地扩展口Catweasel Z-II 上 Catweasel 寄存器也映射于此。切勿触碰请使用 multidisk.device$f00只读、字节访问Bit 7 反映 IDE Port 0 的 IRQ 线电平$f01-$f3f$f00 的镜像$f40只读、字节访问Bit 7 反映 IDE Port 1 的 IRQ 线电平$f41-$f7f$f40 的镜像$f80只读、字节访问Bit 7 反映 IDE Port 2 的 IRQ 线电平Catweasel 独有$f81-$fbf$f80 的镜像$fc0只写写入任意值即允许 IDE 端口的 IRQ 传递到 Zorro 总线详见下文$fc1-$fff$fc0 的镜像$1000-$ffffBuddha-Rom位于 ROM 芯片偏移 $1000 处ROM 芯片的 $0-$fff 不可读。ROM 为字节宽映射到偶数地址与 pata_buddha 驱动的映射对应关系这份内存映射在现代驱动中以宏常量形式复现见 drivers/ata/pata_buddha.c#define BUDDHA_BASE1 0x800 #define BUDDHA_BASE2 0xa00 #define BUDDHA_BASE3 0xc00 #define BUDDHA_CONTROL 0x11a #define BUDDHA_IRQ 0xf00 #define BUDDHA_IRQ_MR 0xfc0 /* master interrupt enable */BUDDHA_BASE1/BASE2/BASE3分别对应 IDE-Select 0/2/4 窗口起始地址BUDDHA_IRQ对应 IRQ 状态寄存器基址 $f00BUDDHA_IRQ_MR对应 IRQ 总使能寄存器 $fc0。驱动在 probe 时按板卡类型决定端口数量pata_buddha_probeunsigned int nr_ports (type BOARD_CATWEASEL) ? 3 : 2;即 Buddha 与 X-Surf 各 2 个端口Catweasel 3 个端口——与文档IDE-Select 4/5 为 Catweasel 独有的描述一致。同时驱动申请内存区域时使用board BUDDHA_BASE1起 0x800 字节drivers/ata/pata_buddha.c对应 64K 板卡空间中 $800 起的 IDE 窗口。五、中断机制INT2 轮询与 $fc0 总使能IDE 端口产生 INT2 中断。驱动可通过读取三个Buddha 仅两个状态寄存器 $f00、$f40、$f80 来获知各 IDE 端口的 IRQ 线电平从而在同一 INT2 下区分是哪个端口、哪个驱动需要服务便于并行处理多个 I/O 请求。此外Buddha 与 Catweasel 扩展板还能产生 INT6并为此准备了独立的 I/O 模块与系统操作员 I/O 模块内存映射。$fc0 是一个特殊的只写寄存器写入任意值即允许 IDE 端口的 IRQ 传递到 Zorro 总线。这一机制是为了兼容那些有缺陷或固件存在 bug、启动时会把 IRQ 线拉高的硬盘——若中断始终直通总线计算机可能无法正常启动。该标志一旦使能便无法再关闭且软件无法读回其电平状态。驱动中的中断实现在 drivers/ata/pata_buddha.c 中中断路径被完整实现IRQ 使能pata_buddha_probe对 Buddha/Catweasel 执行z_writeb(0, buddha_board BUDDHA_IRQ_MR)向 $fc0 写入任意值此处为 0打开总使能IRQ 状态读取pata_buddha_irq_check从ap-private_data指向的端口 IRQ 寄存器读取一个字节检查ch 0x80即 Bit 7与文档Bit 7 反映 IRQ 线电平完全对应端口 IRQ 寄存器寻址pata_buddha_probeirqport buddha_board BUDDHA_IRQ i * 0x40即端口 0/1/2 分别落在 $f00、$f40、$f80正是文档中的三个状态寄存器地址中断线挂接pata_buddha_probe通过ata_host_activate(host, IRQ_AMIGA_PORTS, ata_sff_interrupt, IRQF_SHARED, pata_buddha_sht)使用 Amiga 的IRQ_AMIGA_PORTS对应 INT2并声明共享中断与IDE 端口发出 INT2的硬件事实一致。六、速度选择寄存器与访问时序表速度选择寄存器位于 $7fe为字节宽寄存器仅使用高三位Bit 7 至 Bit 5。Bit 4 必须恒为 1以保证与未来 Buddha 版本的兼容性低四位按定义也应置 1。写寄存器时表中数值需左移 5 位并与 $1f 做或运算即置位低 5 位。所有时序的共同特征是Select 与 IOR/IOW 同时上升。IOR/IOW 相对 Zorro 总线时钟约有 30ns 的传播延迟因此表中的数值并非 71 的整数倍。一个时钟周期为 71nsPAL 系统 14.18MHz 下精确值为 70.5ns。值Select 时序IOR/IOW 时序0复位后默认497ns7 个时钟周期172ns 后2 个时钟周期1639ns9 个时钟周期243ns 后3 个时钟周期2781ns11 个时钟周期314ns 后4 个时钟周期3355ns5 个时钟周期101ns 后1 个时钟周期4355ns5 个时钟周期172ns 后2 个时钟周期5355ns5 个时钟周期243ns 后3 个时钟周期61065ns15 个时钟周期314ns 后4 个时钟周期7355ns5 个时钟周期101ns 后1 个时钟周期默认值 0 的时序与不带加速卡的 Amiga 1200 IDE 端口完全相同497ns Select、IOR/IOW 172ns 后有效。关于时序的两点补充说明所有 355ns 的快速 Select 访问是否会被延长取决于系统所用的加速卡某些总线接口会额外插入两个时钟周期使整个访问变为 497ns。这既不影响控制器可靠性也不影响性能因为该情况并不频繁。所有时序均为理论计算值并经实测确认作者可据此数出时钟周期。若系统使用 28.37516MHz 之外的其他振荡器如 NTSC 频率 28.63636MHz每个时钟周期会略短于 70ns差异可忽略。文档也提醒虽然超频系统能带来小幅性能提升但需要 multisync 显示器或显卡且内置软驱会发疯因此不建议用这种方式给 Amiga 调优。七、A61 镜像访问命令访问的固定慢速通道IDE 端口由地址线 A2 至 A4 驱动与 Amiga 1200/4000 的 IDE 端口一致因此已有驱动可以轻松移植到 Buddha。由于每个字都被镜像一次一次move.l会从 IDE 端口的同一地址轮询出两个字虽然无法使用movem但也没必要——这种技术只能加速 68000 系统68020 fastmem 的系统用move.l反而更快。关键特性若使用 A61 的 IDE 端口镜像寄存器例如端口 0 寄存器组 0 的 $840Buddha 将忽略速度寄存器中选定的速度固定以 780ns 进行一次访问。文档建议这些寄存器用于对硬盘/CD-ROM 的命令访问因为命令访问为字节宽按 ATA-X3T9 手册必须放慢执行。对应地以 A61 访问 IDE 寄存器如 $84x时时序恒为模式 0 的 8 位兼容模式781ns Select、IOR/IOW 在 4 个时钟周期314ns后有效无论速度寄存器选择了什么。八、Buddha 与 Catweasel 的软件兼容性设计为了让软件能同时兼容 Buddha 与 Catweasel Z-IIBuddha 在行为上完全模拟一台第三个 IDE 端口未接设备的 Catweasel Z-IIIRQ 寄存器 $f80 在 Buddha 上始终显示无 IRQ对第三个 IDE 端口的访问在 Buddha 上会进入数据 Nirwana即无实际效果。在驱动侧这一设计通过pata_buddha_zorro_tbl将两类板卡映射到不同枚举值BOARD_BUDDHA/BOARD_CATWEASEL统一使用同一套pata_buddha_ops仅端口数量不同见 drivers/ata/pata_buddha.c从而最大化代码复用。九、端口寄存器布局与数据搬运地址线 A2-A4 的代价由于 IDE 端口由地址线 A2-A4 驱动每 4 字节一个寄存器槽位驱动在 pata_buddha_probe 中按base 2 n * 4的步进摆放 libata 的 I/O 地址ap-ioaddr.data_addr base; ap-ioaddr.error_addr base 2 1 * 4; ap-ioaddr.feature_addr base 2 1 * 4; ap-ioaddr.nsect_addr base 2 2 * 4; ap-ioaddr.lbal_addr base 2 3 * 4; ap-ioaddr.lbam_addr base 2 4 * 4; ap-ioaddr.lbah_addr base 2 5 * 4; ap-ioaddr.device_addr base 2 6 * 4; ap-ioaddr.status_addr base 2 7 * 4; ap-ioaddr.command_addr base 2 7 * 4;数据区data_addr在base控制/备用状态区在base BUDDHA_CONTROL0x11a。由于硬件不支持 DMA驱动仅声明ap-pio_mask ATA_PIO4并设置ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY标志drivers/ata/pata_buddha.c。数据搬运采用自定义的 pata_buddha_data_xfer以字为单位用raw_insw/raw_outsw传输对应文档中一次 move.l 轮询两个字的 16 位数据通路并单独处理可能剩余的 1 字节尾部。模式设置则使用 pata_buddha_set_mode将所有设备统一配置为XFER_PIO_0——与文档中速度寄存器决定硬件访问时序的分工不同驱动侧不再做运行时传输模式切换。十、内核配置如何启用 Buddha/Catweasel 支持驱动对应内核配置项在 drivers/ata/Kconfigconfig PATA_BUDDHA tristate Buddha/Catweasel/X-Surf PATA support depends on ZORRO help This option enables support for the IDE interfaces on the Buddha, Catweasel and X-Surf expansion boards on the Zorro expansion bus. It supports up to two interfaces on the Buddha, three on the Catweasel and two on the X-Surf. If unsure, say N.要点依赖ZORRO仅在启用 Zorro 总线m68k Amiga 平台时可编译可编译为模块tristate支持数量Buddha 2 个接口、Catweasel 3 个、X-Surf 2 个。在 Amiga 平台的默认配置 arch/m68k/configs/amiga_defconfig 中该驱动被静态启用CONFIG_PATA_GAYLEy CONFIG_PATA_BUDDHAyCONFIG_PATA_GAYLE是 Amiga 1200/4000 板载 IDE 的驱动与 Buddha 同属 m68k/Amiga IDE 生态两者并列出现说明 Amiga 默认配置即覆盖了板载与扩展板两条 IDE 路径。结语从 1997 年的硬件规格文档到 2018 年重构的 libata 驱动Buddha/Catweasel 的寄存器映射始终保持一致$800/$a00/$c00 的 IDE-Select 窗口、$f00/$f40/$f80 的 IRQ 状态位、$fc0 的一次性中断总使能以及 $7fe 速度寄存器中高三位 低五位掩码的编码方式都被 pata_buddha.c 逐一复现。理解这份寄存器映射不仅有助于阅读 Amiga 时代的第三方驱动代码也能为在现代 Linux 上调试 Zorro 总线 ATA 设备提供最底层的参考依据。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表