為 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 裝置透過呼叫 zorro_find_device() 找到,該函式返回指向具有指定 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