USB驱动—Gadget ACM
一. USB CDC 类简介
USB的CDC类是USB通信设备类(CommunicaTIon Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USB ISDN模型和USB网络模型。其中,USB传统纯电话业务模型,有可分为直接线控制模型(Direct Line Control Model)、抽象控制模型(Abstract Control Model)和USB电话模型(USB Telephone Model)。
通常一个CDC类又由两个接口子类组成,通信接口类(CommunicaTIon Interface Class)和数据接口类(Data Interface Class)。这两个接口子类占有不同数量和类型的终端点(Endpoints)。抽象控制模型(ACM)对端点的需求:通信接口类需要一个控制端点(Control Endpoint),用于向 USB 主机发送通知,数据接口类需要一个用于数据传输的批量输入和一个批量输出终结点。其中控制端点主要用于USB设备的枚举和虚拟串口的波特率和数据类型(数据位数、停止位和起始位)设置的通信。输出方向的端点用于主机(Host)向从设备(Slave)发送数据,相当于传统物理串口中的TXD线(如果从单片机的角度看),输入方向的端点用于从设备向主机发送数据,相当于传统物理串口中的RXD线。
二. USB ACM系统
2.1 ACM系统框架
USB CDC类协议所描述的USB CDC类设备首先像一般的USB设备被USB Core所识别和描述,其次将信息上传至更高层协议,也就是tty协议层,最后通过线路规程的方式,将tty协议层和usb协议层结合使用,完成CDC类设备通信,即tty协议层负责应用程序串口通信。
2.2 CDC-ACM描述符
CDC设备类驱动,除了设置USB定义的标准描述符,还有其特定的描述符。特定描述符根据USB CDC 设备的需要自定义,对于USB虚拟串口,其定义如下图。
三. ACM的配置
3.1 基于configfs配置
Device Drivers --->
USB support --->
USB Gadget Support --->
USB functions configurable through configfs--->
[*] Abstract Control Model (CDC ACM)
3.2 挂载configfs
mount -t configfs none /sys/kernel/config,将configfs挂载到用户态,通完configfs配置usb;
3.3 创建ACM功能
#创建多个ttyACM,使用acm.GS1,acm.GS2,etc.
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.GS0
ln -sf /sys/kernel/config/usb_gadget/g1/functions/acm.GS0 /sys/kernel/config/usb_gadget/g1/configs/c.1
3.4 主机支持ACM设备类
Device Drivers --->
USB support --->
[*] USB Modem (CDC ACM) support
四. USB ACM测试
4.1 驱动加载
4.2 操作设备节点
Host侧:/dev/ttyACM0
Device侧:/de/ttyGS0