付録 D. murasaki.usbmapの書式について

/etc/murasaki/murasaki.usbmap の モジュール定義行は、ファイルの冒頭にもあるように以下の 13 個の変数を空白で区切って記述します。

module

モジュール名

match_flags

利用するモジュールを決定するためにどの変数を調べるかを決定する変数。

表 D-1. フラグの一覧

フラグ名調べる変数
USB_DEVICE_ID_MATCH_VENDOR0x0001idVendor
USB_DEVICE_ID_MATCH_PRODUCT0x0002idProduct
USB_DEVICE_ID_MATCH_DEV_LO0x0004bcdDevice_lo
USB_DEVICE_ID_MATCH_DEV_HI0x0008bcdDevice_hi
USB_DEVICE_ID_MATCH_DEV_CLASS0x0010bDeviceClass
USB_DEVICE_ID_MATCH_DEV_SUBCLASS0x0020bDeviceSubClass
USB_DEVICE_ID_MATCH_DEV_PROTOCOL0x0040bDeviceProtocol
USB_DEVICE_ID_MATCH_INT_CLASS0x0080bInterfaceClass
USB_DEVICE_ID_MATCH_INT_SUBCLASS0x0100bInterfaceSubClass
USB_DEVICE_ID_MATCH_INT_PROTOCOL0x0200bInterfaceProtocol

調べる変数に応じたフラグの OR を取った結果が、変数の値となる。

例 D-1. match_flags の分析

Aug  6 19:30:23 localhost murasaki.usb[751]: MODULE 0x0073
0x46d 0x870 0 0 0xff 0xff 0xff 0x0 0x0 0x0 0x00000000

これはmatchフラグが0x0073なので、

USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT |
USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL
ということで、この5つの値が一致することでドライバが決定されます。ただし、bDeviceClass、bDeviceSubClass、bDeviceProtocolの値が0xffであり、これは any matching を意味しますので実際にはidVendor, idProductの値で決定されます。

注意ビット演算子 | について
 

ビット演算子 | は 2 進数で数値を考えたときの各桁(ビット。0か1で表現される。)のORを取ります。ORは、両方のビットが0でない限り必ず1になります。

例えば、USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCTの計算は次のようになります。

   00000001 (0x0001)
OR)00000010 (0x0002)
--------------------
   00000011 (0x0003)
idVendor

ベンダーID(各ベンダーに割り当てられた固有のID)

idProduct

プロダクトID(各ベンダー毎、製品に割り当てる固有のID)

bcdDevice_lo

ドライバが対応している製品バージョンの下限の Binary Coded Decimal 表記(ほとんど使われない)

bcdDevice_hi

ドライバが対応している製品バージョンの上限の Binary Coded Decimal表記(ほとんど使われない)

bDeviceClass

Deviceクラス

bDeviceSubClass

Deviceサブクラス

bDeviceProtocol

Deviceプロトコル

bInterfaceClass

インターフェースのクラス

bInterfaceSubClass

インターフェースのサブクラス

bInterfaceProtocol

インターフェースのプロトコル

driver_info

ドライバが使用する情報。特に何が指定されるかは決まっていない。通常使われない。