BUS_ALLOC_RESOURCE(9) | FreeBSD Kernel Developer's Manual | BUS_ALLOC_RESOURCE(9) |
名称
bus_alloc_resource, bus_alloc_resource_any — 親のバスからリソースを割り付ける書式
#include < sys/param.h>#include < sys/bus.h>
#include < machine/bus.h>
#include < sys/rman.h>
#include < machine/resource.h>
struct resource *
bus_alloc_resource( device_t dev, int type, int *rid, u_long start, u_long end, u_long count, u_int flags);
struct resource *
bus_alloc_resource_any( device_t dev, int type, int *rid, u_int flags);
解説
これは、リソース管理関数への簡単なインタフェースです。それは、親のメソッドテーブルを通して間接的に隠します。この関数は、一般的にアタッチで呼び出されるべきですが、 (いくつかのまれな場合を除いて) 決して早期に呼び出されるべきではありません。bus_alloc_resource_any() 関数は、 bus_alloc_resource() のための便利なラッパです。それは、デフォルトのリソースとして start, end と count のための値を設定します (下記の start の説明を参照)。
引数は、次の通りです:
- dev は、リソースの所有権を要求するデバイスです。割り付けの前に、リソースは、親のバスによって所有されます。
- type は、割り付けたいリソースのタイプです。それは、次の 1 つです:
- SYS_RES_IRQ
- IRQ のためのタイプ。
- SYS_RES_DRQ
- ISA DMA ラインのためのタイプ。
- SYS_RES_IOPORT
- I/O ポートのためのタイプ。
- SYS_RES_MEMORY
- I/O メモリのためのタイプ。
- rid は、割り付けてられているリソースを識別するバス特有のハンドルを指します。 ISA に関して、これは、PnP メカニズム、または hints メカニズムのいずれかによって、このデバイスのためにセットアップされるリソースの配列へのインデックスです。 PCCARD に関して、これは、PC カードの CIS のエントリによって記述されたリソースの配列へのインデックスです。 PCI に関して、リソースにアクセスするために使用する BAR がある pci 設定空間へのオフセットです。バスメッソドは、それらがパラメータとして与えられる RID を自由に変更することができます。以前に与えた値に依存してはなりません。
- start と end は、リソースの開始/終了アドレスです。 start のための 0ul、 end のための ~0ul、 count ための 1 の値を指定するなら、バスのためのデフォルト値が計算されます。
- count は、リソースのサイズです。例えば、I/O ポートのサイズは、通常 1 バイトです (が、いくつかのデバイスは、これを上書きします)。 start と end のためのデフォルト値を指定した場合で、 count がデフォルト値より小さいなら、バスのデフォルト値が使用され、それがデフォルト値より大きいなら、 count が使用されます。
- flags は、リソースのためにフラグを設定します。これらのフラグの 1 つ以上を設定することができます:
- RF_ALLOCATED
- リソースは、予約されました。リソースは、まだ bus_activate_resource(9) で活性化される必要があります。
- RF_ACTIVE
- 不可分に、リソースを活性化します。
- RF_SHAREABLE
- リソースは、同時の共有を許可します。リソースを共有することができないことを知らないなら、常に設定されるべきです。それは、バスが共有をサポートしないなら、フラグを除去するためのバスのドライバのタスクです。例えば、 pccard(4) は、IRQ を共有することができませんが、一方 cardbus(4) は、できます。
- RF_TIMESHARE
- リソースは、時分割の共有を許可します。
戻り値
成功すれば、 struct resource へのポインタが返され、そうでなければ、NULL ポインタが返されます。使用例
これは、32 バイトの I/O ポート範囲と IRQ を割り付けるいくつかのサンプルコードです。 portid と irqid の値は、これらの呼び出しの後に、デバイスの softc に保存されるべきです。
struct resource *portres, *irqres; int portid, irqid; portid = 0; irqid = 0; portres = bus_alloc_resource(dev, SYS_RES_IOPORT, &portid, 0ul, ~0ul, 32, RF_ACTIVE); irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irqid, RF_ACTIVE | RF_SHAREABLE);
関連項目
bus_activate_resource(9), bus_adjust_resource(9), bus_release_resource(9), device(9), driver(9)作者
このマニュアルページは、 <alex@big.endian.de>によって書かれ、部分的に <imp@FreeBSD.org>によって書かれました。May 18, 2000 | FreeBSD |