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_submit_urb() で発行されたリクエストを USB Core が受けとったらホストコントローラ宛てに urb_enqueue() という手続きが発行される模様。ホストコントローラからは usb_hcd_giveback_urb() という手続きで USB Core 側に戻されるのかどうか。
そして USB Core 側からは callback 呼び出してドライバ側に通知、という形なのか。
参考資料は以下です。