Linux の USB デバイス
日経 Linux 2009/04 特別連載「デバイスを極める」(pp.93-99) より。
- USB はツリー構造
- デバイスはホストコントローラだけと通信する
- 通信チャンネルとしてエンドポイントを使う
- ep:0 は制御用で双方向通信
- ep:0 以外は一方向
- 最上位ビットで流れる方向がわかる (ep:0x01 は OUT の 1番、ep:0x81 は IN の 1番)
- 通信チャンネルとしてエンドポイントを使う
- エンドポイントは機能ごとにインタフェースにまとめられる
- インタフェースごとにデバイスドライバが対応する
- インタフェースはさらにコンフィグレーションにまとめられる
- インタフェース番号 1-1.3:1.0 の場合
- ホストコントローラ #1 のポート 1 に接続された外部 USB ハブのポート 3 のデバイス
- コンフィグレーション番号 1
- インタフェース番号 0
- デバイスが接続されると、まず USB コアが ep:0 でデバイス情報などを読み出す
- デバイス情報
- idVendor, idProduct, etc.
- インタフェース情報
- bInterfaceClass, bNumEndpoints, etc.
- エンドポイント情報
- bEndpointAdress, bmAttributes, bLength, etc.
- デバイス情報
- その後、デバイスドライバの probe() を読み出す
- クラスドライバでアクセスできない機器 (bInterfaceClass が 0? 0xFF?) は idVendor, idProduct 指定でベンダドライバを判別
- /sys/devices/pci0000:00 を見てみよう
代表的なインタフェースクラス ID
0x1 Audio
0x2 CDC-Control
0x3 HID
0x5 Physical
0x6 Image
0x7 Printer
0x8 Mass-Storage
0x9 HUB
0xE0 無線
0xFE Application-Specific
0xFF ベンダー独自クラス
bmAttributes
0 コントロール転送 (ep:0)
1 アイソクロナス転送 (リアルタイム性が必要なもの)
2 バルク転送 (ストレージなど)
3 インタラプティブ転送 (マウスなど)