为 Zorro 设备编写设备驱动程序

作者:

Geert Uytterhoeven <geert@linux-m68k.org> 编写

上次修订:

2003 年 9 月 5 日

简介

Zorro 总线是 Amiga 系列计算机中使用的总线。 感谢 AutoConfig(tm),它是 100% 即插即用的。

Zorro 总线有两种类型,Zorro II 和 Zorro III

  • Zorro II 地址空间为 24 位,位于 Amiga 地址映射的前 16 MB 内。

  • Zorro III 是 Zorro II 的 32 位扩展,它向后兼容 Zorro II。 Zorro III 地址空间位于前 16 MB 之外。

探测 Zorro 设备

通过调用 zorro_find_device() 来查找 Zorro 设备,它返回一个指向具有指定 Zorro ID 的 next Zorro 设备的指针。 对于 Zorro ID 为 ZORRO_PROD_xxx 的板,探测循环如下所示

struct zorro_dev *z = NULL;

while ((z = zorro_find_device(ZORRO_PROD_xxx, z))) {
    if (!zorro_request_region(z->resource.start+MY_START, MY_SIZE,
                              "My explanation"))
    ...
}

ZORRO_WILDCARD 充当通配符并查找任何 Zorro 设备。 如果您的驱动程序支持不同类型的板,则可以使用如下结构

struct zorro_dev *z = NULL;

while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
    if (z->id != ZORRO_PROD_xxx1 && z->id != ZORRO_PROD_xxx2 && ...)
        continue;
    if (!zorro_request_region(z->resource.start+MY_START, MY_SIZE,
                              "My explanation"))
    ...
}

Zorro 资源

在您可以访问 Zorro 设备的寄存器之前,您必须确保它尚未使用。 这是使用 I/O 内存空间资源管理函数完成的

request_mem_region()
release_mem_region()

还提供了声明整个设备地址空间的快捷方式

zorro_request_device
zorro_release_device

访问 Zorro 地址空间

Zorro 设备资源中的地址区域是 Zorro 总线地址区域。 由于 Zorro 总线上的标识总线-物理地址映射,它们也是 CPU 物理地址。

这些区域的处理方式取决于 Zorro 空间的类型

  • Zorro II 地址空间始终映射,并且不必使用 z_ioremap() 显式映射。

    从总线/物理 Zorro II 地址到内核虚拟地址的转换,反之亦然,使用以下方式完成

    virt_addr = ZTWO_VADDR(bus_addr);
    bus_addr = ZTWO_PADDR(virt_addr);
    
  • Zorro III 地址空间必须先使用 z_ioremap() 显式映射,然后才能访问

    virt_addr = z_ioremap(bus_addr, size);
    ...
    z_iounmap(virt_addr);
    

参考资料

  1. linux/include/linux/zorro.h

  2. linux/include/uapi/linux/zorro.h

  3. linux/include/uapi/linux/zorro_ids.h

  4. linux/arch/m68k/include/asm/zorro.h

  5. linux/drivers/zorro

  6. /proc/bus/zorro