为 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);
参考资料¶
linux/include/linux/zorro.h
linux/include/uapi/linux/zorro.h
linux/include/uapi/linux/zorro_ids.h
linux/arch/m68k/include/asm/zorro.h
linux/drivers/zorro
/proc/bus/zorro