最終更新:2014-05-18 (日) 18:24:41 (3646d)
URB
Top / URB
USB Request Block
Windows
- USBデバイスドライバは、ハードウェアとは直接やり取りしない。変わりにURBを作成し、それをバスドライバに転送する。
- A Universal Serial Bus (USB) client driver cannot communicate with its device directly.
- Instead, the client driver creates requests and submits them to the USB driver stack for processing.
- Within each request, the client driver provides a variable-length data structure called a USB Request Block (URB).
- The URB structure describes the details of the request and also contains information about the status of the completed request.
- http://msdn.microsoft.com/en-us/library/windows/hardware/ff537056(v=vs.85).aspx
Linux
- LinuxカーネルのUSBコードは、URB (USB Request Block)と呼ばれるものを使って、すべてのUSBデバイスと通信します
- URBによりUSBリクエストを扱うWindows 98/Windows 2000 の方法に刺激を受けました
- 以前OHCIだのUHCIだのと言われてたソレをURB転送という形で共通化
- http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/usb/uhci.txt.html
構造体
類似
URBのライフサイクル
- USBデバイスドライバによって作成される。
- 特定のUSBデバイスの特定のエンドポイントに割り当てられる。
- USBデバイスドライバによって、USBコアにサブミットされる。
- USBコアによって、特定のデバイスのための特定のUSBホストコントローラに送信される。
- デバイスに対するUSB転送を行うUSBホストコントローラによって処理される。
- 要求が完了したときに、USBホストコントローラドライバがUSBデバイスドライバに通知する。
関数
- usb_fill_control_urb? - initializes a control urb
- usb_fill_bulk_urb - macro to help initialize a bulk urb
- usb_fill_int_urb - macro to help initialize a interrupt urb
- usb_init_urb
- usb_alloc_urb
- usb_submit_urb - USBコアにURBを送信
- usb_hcd_giveback_urb?
- usb_free_urb?
ホストにキューイング
- USBホストコントローラに信号を送るときはhc_driver.urb_enqueueコールバックが呼ばれる。
hc_driver.urb_enqueue
ehci_hc_driver
xhci_plat_xhci_driver
メモ
- urb構造体を、ドライバで静的に、あるいは別の構造体内に作成してはいけません。USBコアがURBを管理するために使う参照カウント?のしくみを破壊してしまうからです。URBの作成 には、関数usb_alloc_urbを呼び出します。