URB 転送云々
ググる先生に色々とお伺いしてみるに、以前 OHCI だの UHCI だのと言われてたソレを URB 転送という形で共通化した事をようやく知りました。
む、この uhci.txt って 3.x なツリーには無いのかな。
memo
富士通さん提供の仮想化関連ドキュメントに Linux での USB ドライバ構成とか URB ライフサイクルに関する記述があったので要点を以下にメモ。
- カーネル内では USB は 3 層のモジュールで実装
- USB function Driver
- USB デバイスごとのドライバ
- URB はここで生成されて USB Core へ転送
- 転送完了時に callback が呼び出される
- USB Core
- Linux カーネルの USB サブシステム
- URB はデバイスに合わせて特定のホストコントローラに転送
- USB Host Controller Driver
- ホストコントローラ HW 用のドライバ
- 転送されてきた URB はコントローラに転送される
- 応答後、URB Core へ転送
- USB function Driver
usb_submit_urb() で発行されたリクエストを USB Core が受けとったらホストコントローラ宛てに urb_enqueue() という手続きが発行される模様。ホストコントローラからは usb_hcd_giveback_urb() という手続きで USB Core 側に戻されるのかどうか。
そして USB Core 側からは callback 呼び出してドライバ側に通知、という形なのか。
参考資料は以下です。