                Zorro デバイス用デバイスドライバの作成
                --------------------------------------

Geert Uytterhoeven <geert@linux-m68k.org> 著
最終更新日： 2003 年 9 月 5 日


1. はじめに
-----------

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 の外に
    あります。


2. Zorro デバイスの検出
-----------------------

Zorro デバイスは `zorro_find_device()' を呼び出すことにより見つけられ
ます。この関数は、指定された Zorro ID を持つ「次の」 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"))
        ...
    }


3. Zorro リソース
-----------------

Zorro デバイスのレジスタにアクセスする前に、それがまだ使われていない
ことを保証しなければなりません。これは、I/O メモリ空間リソース管理
関数を使っておこないます。

    request_mem_region()
    release_mem_region()

デバイスの全てのアドレス空間を要求するショートカットも、同様に提供
されています。

    zorro_request_device
    zorro_release_device


4. 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);


5. 参照
-------

linux/include/linux/zorro.h
linux/include/asm-{m68k,ppc}/zorro.h
linux/include/linux/zorro_ids.h
linux/drivers/zorro
/proc/bus/zorro

------------------------------------------------------------
翻訳団体： JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日：   2004/04/15
翻訳者：   川崎 貴彦 <takahiko(a)hakubi.co.jp>
