Skip to content

USB_CDC_ACM

askn37 edited this page Oct 27, 2026 · 5 revisions

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

記述子列挙構造

  • 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 (エンドポイント記述子)

Standard Device 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 も記述する。

Configuration Descriptor

構成記述子の 9バイトの概要は、標準の形式に従う。そこで指定する wTotalLength の(全般構成記述子要求)範囲には、構成記述子自身を含めて、これ以下の従属記述子全てが連続して列挙されていなければならない。

General Configuration Descriptor Request

全般構成記述子要求 には、複数の インターフェース関連記述子(IAD)を列挙することで、複合デバイスを構成することができる。

Interface Association Descriptor

インターフェース関連記述子(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 Interface Subclass code

既知の 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 Interface Protocol code

既知の 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

Class-Specific Functional Descriptor

従属機能記述子は、先頭 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)の 定数値。

Class-Specific Functional Descriptor subtype code

既知の従属機能符号一覧

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

Header Functional Descriptor

機能前置記述子は、この装置が準拠する 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)

Union Functional Descriptor

結合機能記述子は、結合して扱われるべき複数の従属インターフェースの組を表明する。

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 と表記されることもある。

Abstract Control Management Functional Descriptor

この従属機能記述子は、制御インターフェースが支援する補助クラスの機能を表明する。

  • この種の "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 Functional Descriptor

この従属機能記述子は、この装置の 呼管理(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 装置は 呼管理 を自ら処理する

Country Selection Functional Descriptor

この国選択機能記述子は、装置が使用される国によって法的に制限された機能や、固有の情報を特定するための記述子。無線モデムのような法的認可の必要な機器で使用される。不要なら記述しない。

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) (繰り返し)

Abstract Control Model Requests

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に保ち続けることと同義。

Communications Feature Selector Codes

この選択番号は、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 国コード

Feature Status Returned for ABSTRACT_STATE Selector

データクラスインターフェースを音声通話等のメディアストリームに切替/復旧する場合に使われる。

Bit Value Description
15-2 予約
1 1 データクラスIFの呼管理多重化を許可
0 不許可
0 1 このIFの全通信を禁止(アイドル状態)
0 通常状態

Line Coding Structure

この制御情報は、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" は対応可能。

Control Signal Bitmap Values

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)

Abstract Control Model Notifications

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状態情報を通知することができる。実装は任意。

UART State Bitmap Values

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)は、ふつうフレームエラーも発生させる。

関連リンク

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally