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 インタラプティブ転送 (マウスなど)