Repository navigation
USB_CDC_ACM
ホストOS から USB装置を シリアル通信ポート(RS-232C 相当)として認識させるには、CDC PSDN Subclass の Abstract Control Model 規約に準拠して、Serial Emulation を行うことで実現できる。階層構造は次のようになる。
- CDC - Communications Device Class Revision 1.2 (Errata 1)
- PSTN - Public Switched Telephone Network subclass
- ACM - Abstract Control Model subclass
- CCI - Communications Control Interface set
- CDI - Communications Data Interface set
- ACM - Abstract Control Model subclass
- PSTN - Public Switched Telephone Network subclass
- Standard Device Descriptor(装置記述子)
- Configuration Descriptor(構成記述子)
- Interface Association Descriptor(インターフェース関連記述子)
- Interface Descriptor : CCI (インターフェース記述子)
- Functional Descriptor : Header (CS_INTERFACE)
- Functional Descriptor : ACM (CS_INTERFACE)
- Functional Descriptor : Union (CS_INTERFACE)
- Endpoint Descriptor : Notification (エンドポイント記述子)
- Interface Descriptor : CDI (インターフェース記述子)
- Endpoint Descriptor : Data Out (エンドポイント記述子)
- Endpoint Descriptor : Data In (エンドポイント記述子)
- Interface Descriptor : CCI (インターフェース記述子)
- Interface Association Descriptor(インターフェース関連記述子)
装置記述子 の 18バイトの概要は、標準の形式に従う。そこで指定する 三つ組みクラス符号には、以下の値を記述する。
| Ofs | Field | Value | Description |
|---|---|---|---|
| 4 | bDeviceClass | 0x02 | Communications Device Class code |
| 5 | bDeviceSubClass | 0x02 | Abstract Control Model |
| 6 | bDeviceProtocol | 0x01 | AT Commands (or No class specific 0x00) |
- ここで 三つ組みクラス符号を 完全に指定した場合は、IAD を省略できる。
- IAD を使用する場合は、装置記述子では 補助クラス符号と規約符号はどちらも指定せず
0x00を置く。 - 複数のクラスを同時に実装する複合デバイスかつ Windows(usbccgp.sys)で認識させるには、概ねは
0xEF, 0x02, 0x01を指定し、IAD も記述する。
構成記述子の 9バイトの概要は、標準の形式に従う。そこで指定する wTotalLength の(全般構成記述子要求)範囲には、構成記述子自身を含めて、これ以下の従属記述子全てが連続して列挙されていなければならない。
全般構成記述子要求 には、複数の インターフェース関連記述子(IAD)を列挙することで、複合デバイスを構成することができる。
インターフェース関連記述子(IAD)の 8バイトは、以下のようになる。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | 0x08 | 記述子全体長 |
| 1 | 1 | bDescriptorType | 定数 | 0x0B | INTERFACE_ASSOCIATION |
| 2 | 1 | bFirstInterface | 指標番号 | 0x01 | この配下の 最初の インターフェース記述子指標番号(例えば1) |
| 3 | 1 | bInterfaceCount | 数値 | 0x02 | この配下の インターフェース記述子 の数(ふつう2) |
| 4 | 1 | bFunctionClass | 基本クラス符号 | 0x02 | Communications Device Class |
| 5 | 1 | bFunctionSubClass | 補助クラス符号 | 0x02 | Abstract Control Model Subclass |
| 6 | 1 | bFunctionProtocol | 規約符号 | 0x01 | AT Commands |
| 7 | 1 | iFunction | 指標番号 | * | この記述子を説明する文字列記述子指標番号 |
- 構成にもよるが IAD の存在は(ホスト側アプリケーションに依存するが)必ずしも必須ではない。その場合は 三つ組みクラス符号 を 装置記述子で決定する。
- 規約符号は
0x00(クラス固有プロトコル不要)であってもよい。この例で "AT Command"対応を名乗るのは、汎用のシリアル変換器として実際に "AT Command"で対話する 通信モジュールのような UARTモデム装置と接続する(つまり本来の)用途を想定している。 - IAD を複数組列挙することで、複合デバイスを実装できる。
既知の CDCインターフェース補助クラス符号の一覧
| Code | Class subclass |
|---|---|
| 0x01 | Direct Line Control Model |
| 0x02 | Abstract Control Model ←HERE |
| 0x03 | Telephone Control Model |
| 0x04 | Multi-Channel Control Model |
| 0x05 | CAPI Control Model |
| 0x06 | Ethernet Networking Control Model |
| 0x07 | ATM Networking Control Model |
| 0x08 | Wireless Handset Control Model |
| 0x09 | Device Management |
| 0x0A | Mobile Direct Line Model |
| 0x0B | OBEX |
| 0x0C | Ethernet Emulation Model |
| 0x0D | Network Control Model |
既知の CDCインターフェース規約符号の一覧
| Code | Class Protocol |
|---|---|
| 0x00 | No class specific protocol required |
| 0x01 | AT Commands: [V250] etc ←HERE |
| 0x02 | AT Commands defined by PCCA-101 |
| 0x03 | AT Commands defined by PCCA-101 & Annex O |
| 0x04 | AT Commands defined by GSM 07.07 |
| 0x05 | AT Commands defined by 3GPP 27.007 |
| 0x06 | AT Commands defined by TIA for CDMA |
| 0x07 | Ethernet Emulation Model |
| 0xFE | External Protocol: Functional defne |
| 0xFF | Vendor-specific |
従属機能記述子は、先頭 3バイトの宣言部と、そこで示される従属機能符号毎に定義された指示部とからなる。
- これらは 代表制御インターフェース記述子 の後にまとめて配置する。普通、制御用インターフェース記述子の後に "Header"、"ACM"等の補助クラス管理主管、"Union"、その他の順に並べる。
- 実装する補助クラスによって 使用可能な/省略不能な 従属機能記述子は異なる。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | * | 記述子全体長(3+N) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | * | 従属機能符号(Descriptor subtype) |
| 3 | N | (従属機能符号で決まる指示部) |
-
bDescriptorTypeは0x24(CS_INTERFACE)の 定数値。
既知の従属機能符号一覧
| Subtype | Functional description |
|---|---|
| 0x00 | Header |
| 0x01 | Call Management |
| 0x02 | Abstract Control Management |
| 0x03 | Direct Line Management |
| 0x04 | Telephone Ringer |
| 0x05 | Telephone Call and Line State Reporting Capabilities |
| 0x06 | Union |
| 0x07 | Country Selection |
| 0x08 | Telephone Operational Modes |
| 0x09 | USB Terminal |
| 0x0A | Network Channel Terminal Descriptor |
| 0x0B | Protocol Unit |
| 0x0C | Extension Unit |
| 0x0D | Multi-Channel Management |
| 0x0E | CAPI Control Management |
| 0x0F | Ethernet Networking |
| 0x10 | ATM Networking |
| 0x11 | Wireless Handset Control Model |
| 0x12 | Mobile Direct Line Model |
| 0x13 | MDLM Detail |
| 0x14 | Device Management Model |
| 0x15 | OBEX |
| 0x16 | Command Set |
| 0x17 | Command Set Detail |
| 0x18 | Telephone Control Model |
| 0x19 | OBEX Service Identifier |
| 0x1A | NCM |
機能前置記述子は、この装置が準拠する CDC版番号を 2桁の BCD 形式で表明する。普通は、他の従属機能記述子 に先立って宣言する。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | 0x04 | 記述子全体長(3+1) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | 0x00 | Header |
| 3 | 2 | bcdCDC | 定数 | 0x102 | CDC版番号 (Revision 1.2) |
結合機能記述子は、結合して扱われるべき複数の従属インターフェースの組を表明する。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | * | 記述子全体長(4+N) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | 0x06 | Union |
| 3 | 1 | bControlInterface | 定数 | * | この結合を代表する制御インターフェース番号 |
| 4 | 1 | bSubordinateInterface0 | 数値 | * | この結合内の従属データ等インターフェース番号 |
| N+3 | (bSubordinateInterfaceN-1) | (繰り返し) |
-
bControlInterfaceはbMasterInterfaceと表記されることもある。 -
bSubordinateInterfaceはbSlaveInterfaceと表記されることもある。
この従属機能記述子は、制御インターフェースが支援する補助クラスの機能を表明する。
- この種の "Management Functional" 記述子は、ふつう補助クラス符号と対応するただひとつしか指定しない。(管理主管)
- 自ずから、補助クラス符号
bDescriptorSubtypeが0x02であることが前提。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | 0x04 | 記述子全体長(4) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | 0x02 | Abstract Control Model |
| 3 | 1 | bmCapabilities | ビットマップ | * | この構成が支援する機能 |
bmCapabilitiesには、支援可能な "Control Model"要求記述子の分類を、ビットマップで表す。
| Bit | bmCapabilities |
|---|---|
| 7-4 | (予約) |
| 3 | NETWORK_CONNECTION |
| 2 | SEND_BREAK |
| 1 | SET_LINE_CODING, SET_CONTROL_LINE_STATE, GET_LINE_CODING, SERIAL_STATE |
| 0 | SET_COMM_FEATURE, CLEAR_COMM_FEATURE, GET_COMM_FEATURE |
- 一般的な UART変換装置では、
0x02または0x06であることが多い。
この従属機能記述子は、この装置の 呼管理(Call Management)の方法を表明する。
- これはモデム制御用途なので、単なる UART変換装置では実装する必要はない。つまり
bmCapabilitiesを0x00とするか、記述子自体を宣言しない。 -
bDataInterfaceが有効になるには0b11が書かれなければならない。有効になると SEND_ENCAPSULATED_COMMAND に加える追加制御が許される。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | 0x05 | 記述子全体長(4+N) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | 0x01 | Call Management |
| 3 | 1 | bmCapabilities | ビットマップ | * | この構成が支援する機能 |
| 4 | 1 | bDataInterface | 数値 | * | 呼管理 に使う CDI インターフェース番号 |
| Bit | Value | bmCapabilities |
|---|---|---|
| 7-2 | (予約) | |
| 1 | 0 | 装置は CCI で呼管理を行う |
| 1 | 装置は CDI で呼管理を行う | |
| 0 | 0 | 装置は 呼管理 を自ら行わない |
| 1 | 装置は 呼管理 を自ら処理する |
この国選択機能記述子は、装置が使用される国によって法的に制限された機能や、固有の情報を特定するための記述子。無線モデムのような法的認可の必要な機器で使用される。不要なら記述しない。
| Ofs | Size | Field | Type | Value | Description |
|---|---|---|---|---|---|
| 0 | 1 | bLength | 数値 | * | 記述子全体長(4+2N) |
| 1 | 1 | bDescriptorType | 定数 | 0x24 | CS_INTERFACE |
| 2 | 1 | bDescriptorSubtype | 定数 | 0x07 | Country Selection |
| 3 | 1 | iCountryCodeRelDate | 指標番号 | * | ISO 3166国コードの発行日を示す文字列記述子指標番号 |
| 4 | 2 | wCountryCode0 | 数値 | * | ISO 3166で定義される国コード(16進数形式) |
| 2N+2 | (wCountryCodeN-1) | (繰り返し) |
CDC-ACM 補助クラスが対応すべき(エンドポイント0 で対応する)追加クラス要求/指令。使用可能な(実装した)機能は "ACM Functional Descriptor" で表明する。
| Class Requests | bmRequestType | bRequest | wValue | wIndex | wLength | Data |
|---|---|---|---|---|---|---|
| SEND_ENCAPSULATED_COMMAND | 0 01 00001 | 0x00 | 0 | IF番号 | * | 制御情報 |
| GET_ENCAPSULATED_RESPONSE | 1 01 00001 | 0x01 | 0 | IF番号 | * | 制御情報 |
| SET_COMM_FEATURE | 0 01 00001 | 0x02 | 後述 | IF番号 | * | 状態 |
| GET_COMM_FEATURE | 1 01 00001 | 0x03 | 後述 | IF番号 | * | 状態 |
| CLEAR_COMM_FEATURE | 0 01 00001 | 0x04 | 後述 | IF番号 | 0 | - |
| SET_LINE_CODING | 0 01 00001 | 0x20 | 0 | IF番号 | * | 制御情報 |
| GET_LINE_CODING | 1 01 00001 | 0x21 | 0 | IF番号 | * | 制御情報 |
| SET_CONTROL_LINE_STATE | 0 01 00001 | 0x22 | ビットマップ | IF番号 | 0 | - |
| SEND_BREAK | 0 01 00001 | 0x23 | 実施時間 | IF番号 | 0 | - |
- SEND_ENCAPSULATED_COMMAND と GET_ENCAPSULATED_RESPONSE は呼管理用途なので、単なる UART変換装置では使用されないだろう。付加する制御情報の詳細は実装依存であり、既定されていない。
- SEND_BREAK の
wValueは次のように扱う。-
0x0000- BREAK信号送出終了。通常状態。 -
0xFFFF- BREAK信号送出。0x0000で上書きされるまで継続。 - その他 - 指定値をミリ秒と解釈して
0x0000になるまで BREAK信号送出。 - UART での BREAK信号送出は、TxD線を LOWに保ち続けることと同義。
-
この選択番号は、SET_COMM_FEATURE、GET_COMM_FEATURE、CLEAR_COMM_FEATURE で共通。
| Feature selector | wValue | wIndex | wLength | Description |
|---|---|---|---|---|
| RESERVED | 0x00 | - | - | 予約 |
| ABSTRACT_STATE | 0x01 | IF番号 | 2 | 後述 |
| COUNTRY_SETTING | 0x02 | IF番号 | 2 | ISO 3166 国コード |
データクラスインターフェースを音声通話等のメディアストリームに切替/復旧する場合に使われる。
| Bit | Value | Description |
|---|---|---|
| 15-2 | 予約 | |
| 1 | 1 | データクラスIFの呼管理多重化を許可 |
| 0 | 不許可 | |
| 0 | 1 | このIFの全通信を禁止(アイドル状態) |
| 0 | 通常状態 |
この制御情報は、SET_LINE_CODING と GET_LINE_CODING で共通。
| Ofs | Field | Size | Value | Description |
|---|---|---|---|---|
| 0 | dwDTERate | 4 | 数値 | ボーレート(long型 bps) |
| 4 | bCharFormat | 1 | 0 | 1 Stop bit |
| 1 | 1.5 Stop bit | |||
| 2 | 2 Stop bit | |||
| 5 | bParityType | 1 | 0 | None Parity |
| 1 | Odd | |||
| 2 | Even | |||
| 3 | Mark | |||
| 4 | Space | |||
| 6 | bDataBits | 1 | 数値 | キャラクタビット幅 (5,6,7,8,16) |
- AVR DU系統 で UART設定に転用する場合は以下の制限がある。単なる VCPであるなら キャラクタビット幅以外、関係ない。
- ボーレートは、動作周波数の 1/16384 〜 1/16 の範囲に制限される。例:1200bps 対応は、19.66 MHz 以下でなければならない。
- パリティ形式 "Mark" と "Space" は対応不可。
- "1.5 Stop bit" は "2 Stop bit" に同じとする。
- キャラクタビット幅 "16" は対応不可。一方で "9" は対応可能。
SET_CONTROL_LINE_STATE の wValue 値。半二重モデムハードウェア制御の DTE側設定。
| Bit | Field | Value | Description |
|---|---|---|---|
| 15-2 | 予約 | ||
| 1 | bStateRTS | 0 | Deactivate carrier |
| 1 | Activate carrier (RTS->CTS) | ||
| 0 | bStateDTR | 0 | Not Present |
| 1 | Present (DTR->DSR or CD) |
ACM補助クラスの 制御インターフェース(割込エンドポイント)では、以下の通知をホストに送ることができる。
| Class Requests | bmRequestType | bRequest | wValue | wIndex | wLength | Data |
|---|---|---|---|---|---|---|
| NETWORK_CONNECTION | 1 01 00001 | 0x00 | 0 - Disconnect | IF番号 | 0 | - |
| 1 - Connected | IF番号 | 0 | - | |||
| RESPONSE_AVAILABLE | 1 01 00001 | 0x01 | 0 | IF番号 | 0 | - |
| SERIAL_STATE | 1 01 00001 | 0x20 | 0 | IF番号 | 2 | UART状態情報 |
- NETWORK_CONNECTION は、装置からホストにネットワーク接続の状態を通知することができる。実装は任意。
- RESPONSE_AVAILABLE は、装置からホストに応答が利用可能になったことを通知することができる。これはホストに GET_ENCAPSULATED_RESPONSE 要求の発行を促す。
- SERIAL_STATE は、装置からホストに UART状態情報を通知することができる。実装は任意。
| Bit | Field | Description |
|---|---|---|
| 15-7 | 予約 | |
| 6 | bOverRun | 受信データ破棄 |
| 5 | bParity | パリティエラー |
| 4 | bFraming | フレームエラー |
| 3 | bRingSignal | リング信号アサート(RI) |
| 2 | bBreak | BREAK状態アサート |
| 1 | bTxCarrier | 送信キャリア状態アサート(DSR) |
| 0 | bRxCarrier | 受信キャリア状態アサート(DCD) |
-
SET_CONTROL_LINE_STATE の
bStateRTSと対になる CTS 通知ビット(送信許可)がないことに注意。これは ハードウェアフローを次のように実装すれば良いために必要とされない。- UARTが DCE側から CTSを検出したら、TxDを停止して それ以上データを DCEへ送らないようにする。(DCE側を OverRunさせない)
- データ用エンドポイント(CDI-OUT)は
NAKを ホストに返すようにし、それ以上の TxD用データ送信を中断させる。(ホストを OverRunさせない=CTS通知) - CTSが解除されたら DCEへの TxDを再開する。
- CDI-OUT の
NAKを解除し、ホストからの TxD用データ受信を再開する。
- BREAK状態(RxD継続LOW)は、ふつうフレームエラーも発生させる。
Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) 2026 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/
multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)