企业网站基本信息早教,高端品牌家具排名前十名,西安高端模板建站,贵阳百度做网站电话1 感性认识
在学习USB CDC之前#xff0c;先来看下实际日常生活中真实的设备#xff0c;感官认识下真实应用。下面是我手头的几个#xff0c;都是通过USB CDC协议实现了虚拟COM口。 为什么叫虚拟COM呢#xff1f;简单介绍下介绍下物理COM和LPT口#xff1a; 在比较古老的…1 感性认识在学习USB CDC之前先来看下实际日常生活中真实的设备感官认识下真实应用。下面是我手头的几个都是通过USB CDC协议实现了虚拟COM口。为什么叫虚拟COM呢简单介绍下介绍下物理COM和LPT口在比较古老的电脑主板上的COM和LPT接口现在基本已经淘汰COM串行端口 (Serial Port)。LPT并行端口 (Parallel Port)。这里简单介绍不再详细展开感兴趣自行查找深度了解下。到这就知道为什么说是虚拟COM和LPT了因为是通过USB协议模拟的另外可以发现不仅可以模拟串口还可以模拟SPI、CAN、ETH等等各类的外设接口。USB转SPIUSB转CANUSB转ETHNOTE不一定会显示在端口COM和LTP下哦比如ETH2USB会显示再网络适配器下感官有一定认识后下面来理论学习下。2 简介USBCDCCommunications Device Class通信设备类是 USB 标准中定义的一个设备类别用于支持通信设备通过 USB 接口与主机进行数据交换和控制。它为标准串口、调制解调器、网络适配器等通信设备提供了统一的识别、配置和数据传输框架从而实现设备在 USB 总线上的即插即用和互操作性。该类是USB2.0标准下的一个子类定义了通信相关设备的抽象集合另外可以看出众多外设都可以通过USB cdc实现具体的类协议标准也可以在USB-IF官网找到。之前在USB2.0协议深入理解——从零开始学习USB2.0协议三3.9节介绍过USB2.0的标准类代码可知调制解调器、以太网/WIFI适配器接口类代码0x02CDC-Data类是0x0A。1、设备分类与结构在 USB 描述符体系中CDC 设备通常包含以下接口类通信接口类Communication Interface Class负责设备管理、呼叫控制与事件通知。通常包含一个中断 IN 端点用于向主机通知状态变化如连接建立、速率更改等。数据接口类Data Interface Class负责实际的数据传输。通常包含批量Bulk输入与输出端点用于高效传输数据某些场景也可能使用同步Isochronous端点。2、支持的设备类型CDC 可用于实现多种通信设备例如虚拟串口USB 转串口适配器USB 调制解调器USB 网卡如基于 CDC-ECM、CDC-NCM 子类ISDN 终端适配器ADSL/Cable 调制解调器3、端点配置典型的 CDC 设备包含以下端点中断 IN 端点用于向主机发送通知如链路状态变化。批量 IN/OUT 端点用于双向数据传输。某些子类可能使用同步端点以满足实时性要求。2.1 描述符和HID类接口一样CDC类设备除了包含标准标准描述符还有CDC功能描述符由于CDC兼容很多类型所以CDC功能描述符也是相对较为复杂包含CDC功能描述符、CDC头部功能描述符、CDC呼叫管理功能描述符、CDC 抽象控制管理功能描述符、CDC 直连线路管理功能描述符、CDC 电话铃声功能描述符…当然这些描述符都是为了描述设备功能的device按照描述符格式来描述功能host则按照描述符解析从device获取来的描述符来适配驱动下图是CDC描述符的关系图2.1.1 通用格式偏移字段名大小值/类型描述0bFunctionLength1数值此描述符的大小1bDescriptorType1常量CS_INTERFACE见表12bDescriptorSubtype1常量功能描述符标识符ID见表23(function specific data0)1可变第一个功能特定数据字节……………N2(function specific data N-1)1可变第N个功能特定数据字节其中bDescriptorType字段的类型值表1描述符类型值CS_INTERFACE24hCS_ENDPOINT25hbDescriptorSubtype字段的类型值表2描述符子类型通信接口描述符数据接口描述符功能描述00h是是头部功能描述符标记功能描述符集合的开始01h是否呼叫管理功能描述符02h是否抽象控制管理功能描述符03h是否直连线路管理功能描述符04h是否电话振铃功能描述符05h是否电话呼叫和线路状态报告能力功能描述符06h是否联合功能描述符07h是否国家选择功能描述符08h是否电话操作模式功能描述符09h是否USB终端功能描述符0Ah是否网络通道终端描述符0Bh是否协议单元功能描述符0Ch是否扩展单元功能描述符0Dh是否多通道管理功能描述符0Eh是否CAPI控制管理功能描述符0Fh是否以太网网络功能描述符10h是否ATM网络功能描述符11h-FFhN/AN/A保留将来使用而特定的功能需要根据对应的bDescriptorSubtype字段来区分出的不同功能描述符来定义鉴于描述符众多篇幅有限这里仅仅罗列几个需要开发可以参考协议。2.1.2 头部功能能描述符**头部功能描述符Header Functional Descriptor**用于标识该接口及其相关描述符所遵循的CDC规范版本是所有CDC类特定描述符的起始部分。偏移字段名大小值/类型描述0bFunctionLength10x5固定此描述符的字节数1bDescriptorType1numberCS_INTERFACE 描述符类型2bDescriptorSubtype10x00固定头部功能描述符子类型3bcdCDC2数值遵循的USB通信设备类规范版本号BCD编码2.1.3 CDC 呼叫管理功能描述符**呼叫管理功能描述符Call Management Functional Descriptor**用于描述设备是否支持自身呼叫管理、是否可通过数据类接口收发呼叫管理信息以及相关数据接口号。偏移字段名大小值/类型描述0bFunctionLength10x5固定此功能描述符的字节数1bDescriptorType1numberCS_INTERFACE 描述符类型2bDescriptorSubtype10x01呼叫管理功能描述符子类型3bmCapabilities1Bitmap本配置支持的能力D7…D2: 保留置零D1: 0-仅通过通信类接口收发呼叫管理信息1-可通过数据类接口收发呼叫管理信息D0: 0-设备不自行处理呼叫管理1-设备自行处理呼叫管理。若D0为0D1值被忽略且为兼容性应置零。4bDataInterface1number可选用于呼叫管理的数据类接口的接口号配置中的零基索引2.1.4 CDC 抽象控制管理功能描述符**抽象控制管理功能描述符Abstract Control Management Functional Descriptor**用于标识设备支持哪些CDC ACM如虚拟串口相关的标准请求和通知主机据此决定可用的控制命令。用于描述通信类接口SubClass为抽象控制模型Abstract Control Model所支持的命令。它只能出现在接口描述符的类特定部分。偏移字段名大小值/类型描述0bFunctionLength10x4固定此功能描述符的字节数1bDescriptorType1numberCS_INTERFACE 描述符类型2bDescriptorSubtype10x02固定抽象控制管理功能描述符子类型3bmCapabilities1Bitmap本配置支持的能力位图位为0表示不支持该请求D7…D4: 保留置零D3: 1-支持Network_Connection通知D2: 1-支持Send_Break请求D1: 1-支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知D0: 1-支持Set_Comm_Feature、Clear_Comm_Feature、Get_Comm_Feature请求2.1.5 CDC 联合功能描述符**Union Functional Descriptor联合功能描述符**用于将多个接口如通信接口和数据接口组织为一个功能单元便于主机识别和统一管理。主控接口可对整个组进行操作和接收通知。联合功能描述符用于描述一组接口之间的关系这些接口可以被视为一个功能单元。它只能出现在接口描述符的类特定部分。在这组接口中有一个接口被指定为主控接口master interface可以通过该接口对整个组进行操作或接收通知。组内的接口可以包括通信类、数据类或其他任何有效的USB接口类如音频、HID、监控等。偏移字段名大小值/类型描述0bFunctionLength1number此功能描述符的字节数1bDescriptorType1numberCS_INTERFACE 描述符类型2bDescriptorSubtype10x06固定联合功能描述符子类型3bMasterInterface1number作为主控master或控制接口的通信类或数据类接口号bInterfaceNum零基4bSlaveInterface01number第一个从属slave或关联接口的接口号bInterfaceNum零基……………N3bSlaveInterfaceN-11number第N-1个从属或关联接口的接口号以上简单罗列了4个CDC功能描述符更多的可以参考协议spec这里不再一一列举。后续会用一个USB模拟串口实例再来看下描述符具体使用。2.3 特定类请求之前由介绍过USB2.0的标准设备请求请求格式和标准请求但是作为特定的CDC类只有标准请求是无法完成设备枚举的所以就需要特定类请求下面就来学习了解下CDC的特定类请求。USB通信接口类Communication Interface Class支持一系列类特定请求用于设备管理、控制、配置和状态查询。这些请求通过管理元素Management Element发送适用于不同的设备视图。2.3.1 请求格式实际和标准请求格式是基本一样的只是在对应位域字段、请求命令以及内容上的不同另外多了data字段如下偏移量字段大小值描述0bmRequestType1Bitmap请求特性•D7数据传输方向0 主机到设备1 设备到主机•D6…5请求类型00 标准01 类10 厂商11 保留•D4…0接收方00000 设备00001 接口00010 端点00011 其他00100…11111 保留1bRequest1number具体的请求编号参见表32wValue2number一个字长2字节的字段其含义根据具体请求而变化4wIndex2索引或偏移一个字长2字节的字段其含义根据具体请求而变化通常用于传递一个接口或端点的索引6wLength2计数如果存在数据阶段则表示要传输的字节数7datan值可选的数据阶段内容。此部分并非标准SETUP数据包固定8字节的一部分而是用于表示后续数据阶段可能传输的、长度由wLength指定的数据块。其中bmRequestType字段请求类型如果是标准请求则D6-500而类请求D6-501。其他和标准请求一样参考之前在USB2.0协议深入理解——从零开始学习USB2.0协议三。bRequest字段请求code(表3)请求名称代码值十六进制请求名称代码值十六进制SEND_ENCAPSULATED_COMMAND00hGET_OPERATION_PARMS33hGET_ENCAPSULATED_RESPONSE01hSET_LINE_PARMS34hSET_COMM_FEATURE02hGET_LINE_PARMS35hGET_COMM_FEATURE03hDIAL_DIGITS36hCLEAR_COMM_FEATURE04hSET_UNIT_PARAMETER37hSET_AUX_LINE_STATE10hGET_UNIT_PARAMETER38hSET_HOOK_STATE11hCLEAR_UNIT_PARAMETER39hPULSE_SETUP12hGET_PROFILE3AhSEND_PULSE13hSET_ETHERNET_MULTICAST_FILTERS40hSET_PULSE_TIME14hSET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER41hRING_AUX_JACK15hGET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER42hSET_LINE_CODING20hSET_ETHERNET_PACKET_FILTER43hGET_LINE_CODING21hGET_ETHERNET_STATISTIC44hSET_CONTROL_LINE_STATE22hSET_ATM_DATA_FORMAT50hSEND_BREAK23hGET_ATM_DEVICE_STATISTICS51hSET_RINGER_PARMS30hSET_ATM_DEFAULT_VC52hGET_RINGER_PARMS31hGET_ATM_VC_STATISTICS53hSET_OPERATION_PARMS32h可以看出CDC特定类请求是很多的这里简单列举几个其他的可以参考spec。2.3.2 CDC SendEncapsulatedCommand请求SendEncapsulatedCommand用于向通信类接口发送一条“封装命令”命令内容和格式由该接口支持的控制协议如AT命令、PPP、以太网等决定。常用于调制解调器、以太网等CDC设备的主机与设备间的协议命令下发。字段值/说明bmRequestType0x21 (00100001B)• 方向: 主机到设备• 类型: 类• 接收者: 接口bRequest0x00 (SEND_ENCAPSULATED_COMMAND)wValue0x0000wIndex接口号Interface NumberwLength数据长度Data阶段下发的命令长度单位字节Data控制协议命令内容如AT命令、PPP帧等具体由设备支持的协议决定示例比如主机向CDC解制调节器接口发送AT命令就可以是以下格式bmRequestType:0x21bRequest:0x00wValue:0x0000wIndex:0x0001假设接口号为1 wLength:4Data:“AT\r\n”ASCII码2.3.3 CDC GetEncapsulatedResponse请求GetEncapsulatedResponse用于从通信类接口获取“封装命令”的响应数据。通常与SendEncapsulatedCommand配对使用主机先发命令再用此请求取回设备响应。字段值/说明bmRequestType0xA1 (10100001B) 方向:设备到主机类型:类接收者:接口bRequest0x01 (GET_ENCAPSULATED_RESPONSE)wValue0x0000wIndex接口号wLength期望读取的最大数据长度主机分配的缓冲区大小Data设备返回的响应内容协议相关示例主机请求调制解调器的AT命令响应bmRequestType:0xA1bRequest:0x01wValue:0x0000wIndex:0x0001wLength:64假设主机准备读取最多64字节 Data:设备返回的响应如”OK\r\n”2.3.4 CDC SetLineCodingSetLineCoding用于设置异步线路字符格式化属性适用于异步字节流数据类接口和端点。主机通过此请求配置数据传输的格式参数如波特率、数据位、停止位、奇偶校验等影响主机到设备和设备到主机的双向数据传输。字段值/说明bmRequestType0x21 (00100001B) 方向:主机到设备类型:类接收者:接口bRequest0x20 (SET_LINE_CODING)wValue0x0000wIndex接口号wLengthLine Coding Structure 的大小通常为7字节DataLine Coding Structure见下结构体codetypedefstruct_LINE_CODING{uint32_tdwDTERate;// 波特率如9600, 19200, 38400等uint8_tbCharFormat;// 停止位0:1位, 1:1.5位, 2:2位uint8_tbParityType;// 奇偶校验0:无, 1:奇, 2:偶, 3:标记, 4:空格uint8_tbDataBits;// 数据位5,6,7,8,16}LINE_CODING;2.3.5 CDC GetLineCodingGetLineCoding 用于获取当前配置的线路编码参数。主机通过此请求查询设备当前的异步数据传输格式设置包括波特率、数据位、停止位、奇偶校验等参数。字段值/说明bmRequestType0xA1 (10100001B) 方向:设备到主机类型:类接收者:接口bRequest0x21 (GET_LINE_CODING)wValue0x0000wIndex接口号wLengthLine Coding Structure 的大小7字节DataLine Coding Structure见上面 LINE_CODING结构体2.3.6 CDC SetControlLineStateSetControlLineState用于生成RS-232/V.24风格的控制信号模拟传统串口通信的控制线状态。主机通过此请求控制设备的DTRData Terminal Ready和RTSRequest To Send信号实现流控制和设备状态指示。字段值/说明bmRequestType0x21 (00100001B) 方向:主机到设备类型:类接收者:接口bRequest0x22 (SET_CONTROL_LINE_STATE)wValue控制信号位图Control Signal BitmapD15…D2: RESERVED复位为0D1: 载波控制半双工调制解调器对应V.24信号105和RS-232信号RTS0停用载波 1启用载波 ;全双工模式下设备忽略此位D0: DTE存在指示对应V.24信号108/2和RS-232信号DTR0不存在 1存在wIndex接口号wLength0Data无这里仅列举以上几个另外后续将模拟串口会用到0x20、0x21和0x22这三个类请求。2.4 CDC 通知元素通知Notification Element Notifications定义了通信接口类通知设备使用这些通知来通知主机接口或端点事件。这些通知通过中断端点发送用于实时状态更新和事件报告。2.4.1 通知格式偏移量字段大小值描述0bmRequestType1Bitmap请求特性•D7数据传输方向0 主机到设备1 设备到主机•D6…5请求类型00 标准01 类10 厂商11 保留•D4…0接收方00000 设备00001 接口00010 端点00011 其他00100…11111 保留1bNotification1number具体的通知类型NETWORK_CONNECTION网络连接00h0 – 断开连接 1 – 已连接RESPONSE_AVAILABLE响应可用01hRESERVED保留未来使用02h-07hAUX_JACK_HOOK_STATE辅助插孔挂机状态08h0 – 挂机 1 – 摘机RING_DETECT振铃检测09hRESERVED保留未来使用0Ah-1FhSERIAL_STATE串口状态20hUART 状态位图RESERVED保留未来使用21h-27hCALL_STATE_CHANGE呼叫状态变更28h包含呼叫索引和状态变更值LINE_STATE_CHANGE线路状态变更29h可变长度线路状态结构CONNECTION_SPEED_CHANGE连接速度变更2Ah8 字节连接速度数据结构RESERVED保留未来使用2Bh-FFh2wValue2number一个字长2字节的字段其含义根据具体请求而变化4wIndex2索引或偏移一个字长2字节的字段其含义根据具体请求而变化通常用于传递一个索引或偏移量6wLength2计数如果存在数据阶段则表示要传输的字节数7datan值可选根据特定请求含义不同篇幅原因后面列举其中两个。2.4.2 CDC NetworkConnectionNetworkConnection通知允许设备向主机报告网络连接状态的变化。当设备的网络连接状态发生变化时如连接建立或断开设备会通过此通知实时告知主机。字段值/说明bmRequestType0xA1 (10100001B) 方向:设备到主机类型:类接收者:接口bNotification0x00 (NETWORK_CONNECTION)wValue0 断开连接1 已连接wIndex接口号wLength0Data无以太网连接 1 检测到以太网连接建立以太网断开 0 检测到以太网连接断开无线网络连接 1 检测到WiFi连接建立无线网络断开 0 检测到WiFi连接断开2.4.3 CDC SerialState通知SerialState 通知发送UART状态的异步通知。此通知用于报告UART的各种状态信号包括载波检测、传输载波、中断、振铃信号和设备溢出错误等。这些信号通常存在于UART中用于通信状态报告。字段值/说明bmRequestType0xA1 (10100001B) 方向:设备到主机类型:类接收者:接口bNotification0x20 (SERIAL_STATE)wValue0x0000wIndex接口号wLength2DataUART状态位图D15…D7: RESERVED 保留供将来使用D6: bOverRun 由于设备溢出接收数据已被丢弃D5: bParity 发生奇偶校验错误D4: bFraming 发生帧错误D3: bRingSignal 设备振铃信号检测状态D2: bBreak 设备中断检测机制状态D1: bTxCarrier 传输载波状态。对应V.24信号106和RS-232信号DSRD0: bRxCarrier 设备接收载波检测机制状态。对应V.24信号109和RS-232信号DCD3 实例——模拟串口3.1 描述符这里简单说下配置描述符配置描述符定义了一个CDC-ACMAbstract Control Model设备包含1个配置Configuration 12个接口Interface 0 和 Interface 14个端点包括EP0实际描述符中定义了3个额外端点关系如下其中:EP0用来管理和关键配置EP1用来实现异步状态通知EP2/EP3为数据传输提供独立的物理通道。配置描述符里详细配置和其他描述符不再一一具体说明注释里已包含如有问题可参照前面章节比对。constunsignedcharDevDes[18]{0x12,/* bLength */0x01,/* bDescriptorType : device_descriptor */0x00,0x02,/* bcdUSB usb2.0 0x0200 usb1.1 0x0110 usb3.11 0x0311 */0x02,/* bDeviceClass (Notice: should be 0x02 CDC)*/0x02,/* bDeviceSubClass(ACM class) */0x00,/* bDeviceProtocol */0x40,/* bMax EP0 PacketSize : 64bytes*/0x66,0x66,/* idVendor : 2 Bytes (just for test) */0x88,0x88,/* idProduct : 2 Bytes (just for test) */0x00,0x02,/* bcdDevice rel. 2.00 */0x01,/* Index of manufacturer string */0x02,/* Index of product string */0x03,/* Index of serial number string */0x01/* bNumConfigurations */};/* dev Configurations */constunsignedcharConDes[9955457977]{// Configuation Descriptor0x09,/* bLength */0x02,/* bDescriptorType : interface descriptor */sizeof(ConDes)0xFF,(sizeof(ConDes))80xFF,// wTotalLength0x02,// bNumInterfaces0x01,// bConfigurationValue0x00,// iConfiguration0x80,// bmAttributes0x32,// bMaxPower : 100mA// Interface 0 (CDC)0x09,// bLength0x04,// bDescriptorType0x00,// bInterfaceNumber0x00,// bAlternateSetting0x01,// bNumEndpoints(exclude Ep0)0x02,// bInterfaceClass (CDC)0x02,// bInterfaceSubClass (Abstract Control Model)0x01,// bInterfaceProtocol : (Common AT Commands)0x00,// iInterface// functional descriptors0x05,// bLength: Endpoint Descriptor size0x24,// bDescriptorType: CS_INTERFACE0x00,// bDescriptorSubtype: Call Management Func Desc0x10,0x01,// bcdCDC: spec release number : 0x01100x05,// bFunctionLength0x24,// bDescriptorType0x01,// bDescriptorSubtype: Call Management Func Desc0x00,// bmCapabilities: D0 D10x00,// bDataInterface: 10x04,// bFunctionLength0x24,// bDescriptorType: CS_INTERFACE0x02,// bDescriptorSubtype: Abstract Control Management desc0x02,// bmCapabilities suport Set_Line_Coding Set_Control_Line_State Get_Line_Coding Serial_State0x05,// bFunctionLength0x24,// bDescriptorType: CS_INTERFACE0x06,// bDescriptorSubtype: Union func desc0x00,// bMasterInterface: Communication class interface0x01,// bSlaveInterface0: Data Class Interface// Endpoint 10x07,// bLength0x05,// bDescriptorType0x81,// Ep1 : In0x03,// bmAttributes : Interrupt0x40,0x00,// wMaxPackeSize : 0x00400x0F,// bInterval : 256ms// Interface 1 (Data)0x09,// bLength0x04,// bDescriptorType0x01,// bInterfaceNumber0x00,// bAlternateSetting0x02,// bNumEndpoints(exclude Ep0)0x0A,// bInterfaceClass (CDC-Data)0x00,// bInterfaceSubClass (Abstract Control Model)0x00,// bInterfaceProtocol : (Common AT Commands)0x00,// iInterface// Endpoint 20x07,// bLength0x05,// bDescriptorType0x82,// Ep2 : In0x02,// bmAttributes : Bulk0x40,0x00,// wMaxPackeSize : 0x00400x0F,// bInterval// Endpoint 30x07,// bLength0x05,// bDescriptorType0x03,// Ep3 : Out0x02,// bmAttributes : Bulk0x40,0x00,// wMaxPackeSize : 0x00400x00// bInterval};/* langDes */constunsignedcharLangDes[]{0x04,0x03,0x09,0x04};/* Manuf */constunsignedcharManuf_Des[]{0x0E,0x03,0x48,0x00,// Hezaiz0x65,0x00,0x7A,0x00,0x61,0x00,0x69,0x00,0x7A,0x00,};/* product Des */constunsignedcharProd_Des[]{0x20,0x03,0x44,0x00,// DEMO USB2.0 CDC0x45,0x00,0x4D,0x00,0x4F,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x42,0x00,0x32,0x00,0x2e,0x00,0x30,0x00,0x20,0x00,0x43,0x00,0x44,0x00,0x43,0x00,};/* product ser */constunsignedcharSerDes[18]{0x12,0x03,0x32,0x00,// 202205220x30,0x00,0x32,0x00,0x35,0x00,0x31,0x00,0x32,0x00,0x31,0x00,0x32,0x00,};uint8_tDeviceQualifierDesc[]{0x0A,0x06,0x10,0x01,0x00,0x00,0x00,0x40,0x01,0x00,};// cdc para 57600, 1, None, 8bitunsignedcharLineCoding[7]{0x80,0x25,0x00,0x00,0x00,0x00,0x08};3.2 枚举流程和HID枚举流程类似通过控制传输和EP0通信完成描述符的上报具体不同点在于类请求部分但流程大致差不多具体流程不再展开可以参考USB2.0枚举流程以鼠标为例——从零开始学习USB2.0协议四鼠标枚举流程。3.3 数据收发device程序里做了一个回显的demo即串口助手通过host向device发送数据device会回复给host相同的数据并通过真实串口打印出来。演示如下USB_CDC_COM抓下数据收发包可以通过ASCII码表解析出来就是“hello world!”然后组包后由发了出去。USB Device Tree抓取host端信息参考usbcdc11USB CDC从理论到实践_usb cdc土门-CSDN博客USB通信设备类CDC简介 - USB中文网USB 设备编程_2 - 韦东山嵌入式开发者社区全面解析USB CDC通信设备类规范与应用-CSDN博客