Next: Linux USB コアドライバ関数
Up: Linux USB デバイスドライバのフレームワーク
Previous: Linux USB デバイスドライバのフレームワーク
USB コアドライバで導入されている Linux の USB Request Block(URB)
について説明する. これは Windows 環境のドライバにおける URB と同様の
ものである. URB とは SCSI の CDB のようなものでデバイスドライバは
URBを使用して USB データ転送要求を行なう. 以下 linux/usb.h にある
URB 構造体を示す.
次に Linux USB コアドライバで提供されている URB 関連の関数を次に示す.
- urb_t *usb_alloc_urb(int iso_packets)
この関数で URB をメモリにアロケートする. 返ってくる値はアロケートされた
URBへのポインタで, アロケーションに失敗したら0 が返る. isoframes
引数にはスケジュールしたいアイソクロナス転送のフレーム数を指定す
る. 制御, バルク, 割り込み転送の場合は 0 である.
- void usb_free_urb(urb_t* urb)
この関数で指定した URB をメモリから解放する.
- int usb_submit_urb(urb_t *urb)
この関数で指定した URB の転送を行なう.
- int usb_unlink_urb(urb_t *urb)
この関数で内部リストの URB を削除し, 全てのアロケートされている
ハードウエアデスクリプタを開放する. usb_unlink_urb()が終了後,
usb_free_urb(urb) で URB と関連する可能性のある全てのデータを安全
に開放できる.
トランザクションのタイプにより, 以下のような単に URB を作るマクロ
がある. 一般に全てのマクロは USB デバイスへのポインタ, パイプ
転送バッファ, 要求する転送長, 終了ハンドラ, 自分自身のコンテキストが
必要である.
- FILL_CONTROL_URB()
- FILL_BULK_URB()
- FILL_INT_URB()
- FILL_CONTROL_URB_TO()
- FILL_BULK_URB_TO()
Kazuo Nakayoshi
Wed Jun 27 22:15:09 JST 2001