壊れたメガネ

ホッチキスの達人の意識の高いブログ。

webcam の descriptor についてのメモ

手元にある webcam を用いて確認したことについてのメモです。
次のボタンを押すと今回ダンプした config descriptor が JavaScript コンソールに表示されます。

descriptor には extra というプロパティに Class Specific なディスクリプタが存在する場合、バイナリで直接格納されます。JavaScript コンソールに表示させるにあたってこれらに base64 エンコードを施しています。

IAD について

9.X.Y Interface Association

The Interface Association Descriptor is used to describe that two or more interfaces are associated to the same function. A device must use an Interface Association descriptor for each device function that requires more than one interface. An Interface Association descriptor is always returned as part of the configuration information returned by a GetDescriptor(Configuration) request.
An interface association descriptor cannot be directly accessed with a GetDescriptor() or SetDescriptor() request.

(IAD は一つの機能(functionality)に複数の interface を関連付けるために使われる。
デバイスは、ひとつ以上の interface を要するデバイスのすべての機能に IAD を使う必要がある。
IAD は GetDescriptor(Configuration) リクエストの結果の一部として返される。
IAD は GetDescriptor() または SetDescriptor() で直接にはアクセスできない。)

InterfaceAssociationDescriptor_ecn.pdf (PDF)

8.1. Standard USB AV Descriptors

It is highly recommended that USB Devices that incorporate AV functionality use the value triplet (0xEF, 0x02, 0x01) for their bDeviceClass, bDeviceSubclass, and bDeviceProtocol fields in the standard Device Descriptor

USB AV Specification Rev 1.0/AVFunction v1.0.pdf
Base Class EFh (Miscellaneous)

手元にある webcam の config descriptor でも、 IAD を有する config descriptor の特徴を確認できた。

  • bDeviceClass: 0xEF
  • bDeviceSubClass: 0x02
  • bDeviceProtocol: 0x01

config descriptor の取得には usb_get_active_config_descriptor() を用いた。
この関数の戻り値は stdClassインスタンスであり、 IAD ディスクリプタextra プロパティに単なるバイナリとして格納される。

IAD structure

Offset Field Size Value Description
0 bLength 1 Number Size of this descriptor in bytes.
1 bDescriptorType 1 Constant INTERFACE ASSOCIATION Descriptor.
2 bFirstInterface 1 Number Interface number of the first interface that is associated with this function.
3 bInterfaceCount 1 Number Number of contiguous interfaces that are associated with this function.
4 bFunctionClass 1 Class Class code (assigned by USB-IF). A value of zero is not allowed in this descriptor. If this field is FFH, the function class is vendor-specific. All other values are reserved for assignment by the USB-IF.
5 bFunctionSubClass 1 SubClass Subclass code (assigned by USB-IF). If the bFunctionClass field is not set to FFH all values are reserved for assignment by the USB-IF.
6 bFunctionProtocol 1 Protocol Protocol code (assigned by USB-IF). These codes are qualified by the values of the bFunctionClass and bFunctionSubClass fields.
7 iFunction 1 Index Index of string descriptor describing this function.

Interface Association Descriptors (PDF)

この IAD 以外にも二つ extra を持つ descriptor があった。

  • descriptor.interface[0].altsetting[0].extra // ... (1)
  • descriptor.interface[1].altsetting[0].extra // ... (2)

どちらの extra もどういった構造になっているのか全体を把握できていないが、それぞれの先頭部分には次の descriptor が位置していることが先頭2バイト、 bLength, bDescriptorType から読み取れる。

  • (1) Class-specific VideoControl Interface Descriptor
    USB_Video_Example 1.5.pdf 2.3.4.2 Class-specific VC Interface Descriptor
  • (2) Class-specific VideoStreaming Header Descriptor (Input)
    USB_Video_Example 1.5.pdf 3.3.5.1.2 Class-specific VS Header Descriptor (Input)

bLength が固定長として定義されない descriptor がこれらに続いている様。