USB CDC类、USB2.0标准与PSTN之间的关系
CDC(Communication Device Class)类是USB2.0标准下的一个子类,定义了通信相关设备的抽象集合。它与USB2.0标准以及其下的子类的相互关系如下图所示:
如上图,USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,这些在urb.org官网上有具体的定义,这里我们主要讲的是通信类CDC,CDC类下面,根据具体的应用场合,又有一些子类,这里我们主要讲的是PSTN(Public Switched Telephone Network)。从PSTN官方标准文档来看,PSTN子类是一个与电信相关的子类,而这里,我们只是将它作为一个普通的通信设备使用,并没有使用到它的一些电话特性。
从一个具体的CDC类通信数据说起
如上图,USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的,这也就是为什么上图中,在操作虚拟串口之前会有两条数据通信的数据。
之所以会有虚拟串口操作,主要是我们通常使用PC作为host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口。这样以来,可以方便PC端软件通过操作串口的方式来与其进行通信。但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB的操作等。这里需要注意的是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率,驱动访问USB外设有效速率以及外部环境对通信本身造成的干扰率等因素。
CDC类设备枚举过程
CDC类设备与其他标准USB设备枚举过程并没有什么特殊的地方,在描述符内可以使用DeviceClass=0x00, SubClass=0x00, Protocol=0x00 表示此类信息在接口描述符内给出;或者也可以使用0x02,0x00,0x00 来表明该设备为CDC类设备。或者使用0xef, 0x02,0x01表示当前为复合设备。
CDC类设备在枚举过程中最主要的信息存储在配置描述符内:
如上图所示,CDC类的配置描述符一般包含两个接口(interface0)为控制接口,另外一个是Interface1为数据接口,除此之外,还有一个虚线指向IAD(Interface Association Description)这个是可选的,得根据实际情况来确定其是否真实存在。
控制接口
控制接口侠包含一个类描述符和一个端口(ie:0x82),这个端点(中断传输模式)为异步通知消息的端点,当设备需要向Host端发送异步消息时,可以通过此端点来发送,但平时主机端都是通过端点0来向设备端发送控制消息的,比如哪些虚拟串口的操作指令等。