1. 背景介绍
串口是一种经典且对软件工程师友好的通信方式,因为可以在直接使用echo
进行通信,不需要驱动,非常的方便,但当使用串口时,往往需要用到杜邦线和usb2ttl设备,虽然软件上面方便了,但是硬件却不方便,因此如果能将常见的USB设备变成串口设备,那么使用串口就会变的非常方便了。
在Linux提供一套较为灵活的Gadget框架,让使用者可以自定义USB设备的功能,本文就会使用该框架将USB设备变成串口设备。
1.1 实验设备
硬件设备:GDK8
GDK8是我的主力开发机,可以非常方便的在ARM上编译代码,免去了交叉编译的苦恼,而它最大的特色就是可以进行JTAG调试。
相信现在非常多的领域都需要研究Linux内核,而传统的内核调试方法就是printk,而像kgdb这样的软件调试器又有调试不了的“盲区”,基于这种情况就只能使用JTAG技术,但市场上的芯片又不给你把JTAG引脚弄出来,于是想要使用JTAG进行调试是非常困难的,但是GDK8可以非常轻松的通过挥码枪与底层的Coresight协议进行交互,进行JTAG调试,大大提高了我解决问题的效率。
1.2 USB总线
USB是Universal Serial Bus,中文是通用串行总线,是英特尔领导开发的一种设备总线,在如今的计算机设备中,可以非常容易的见到USB设备的身影,打开计算机中的设备管理器,就可以在通用串行总线下面看到现在正在工作的USB设备。
当然USB的接口是非常丰富的,比较常见的有USB 2.0、USB 3.0以及USB Type-C,但是从物理上的逻辑结构来说,USB可以分成两大类,分别是主机端 Host和设备端 Device。
其中主机端用于连接具有USB接口的设备(设备端),并读写数据,比如计算机上面的USB接口,而设备端用于连接主机端,比如鼠标、键盘、U盘等USB设备。
OTG(On The Go)是USB 2.0引入的一种模式,在这种模式下USB既可以当主机端,又可以当设备端,双方通过主机协商协议(Host Negotiation Protocol)进行协商,具体谁当主机端,谁当设备端。
1.3 USB设备控制器-UDC
针对USB的这两种逻辑结构,Linux中将USB的驱动也分成两类,分别是USB设备驱动(USB Devices Drivers)和USB器件驱动(USB Gadget Drivers),而UDC(USB设备控制器 USB Device Controller)可以和USB器件驱动一块工作,作为驱动为其他USB主机端连接的USB设备提供服务,在LInux中可以在/sys/class/udc/
目录下看到已注册的UDC设备。
对于UDC而已,有三种重要的文件系统,分别是Gadget File System
、Function File System
以及Gadget Config File System
,Gadget File System
供用户空间使用Gadget
功能,Function File System
是Config File System
的重制版,支持产生USB的Gadget
功能,Config File System
支持配置产生USB设备。
之所以不用system file system
是因为sysfs
将内核创建的对象暴漏给用户空间,但不允许用户空间对内核空间的对象进行实例化,所以需要Config File System
在用户空间对内核空间的对象进行实例化。
2. 所需支持
如果想要使用使用USB Gadget框架定义特殊的USB设备,那么还需要硬件及内核的支持
2.1 OTG
想要使用UDC首先需要USB接口支持OTG,这个非常重要,如果只支持主机端,那么则不能使用UDC。
如果拥有OTG功能,则需要确认USB接口处于OTG模式,可以通过/sys/devices/platform/ff450000.syscon/ff450000.syscon:usb2-phy@100/otg_mode
虚文件指定需要的模式。
echo otg > /sys/devices/platform/ff450000.syscon/ff450000.syscon:usb2-phy@100/otg_mode
2.2 内核配置选项
如果想要设备提供USB转串口的功能,首先需要内核提供相应的支持,下面是USB相关的内核配置选项,需要确认它们处于开启状态。
# USB HID support
CONFIG_USB_HID=y
CONFIG_USB_HIDDEV=y
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
# Miscellaneous USB options
CONFIG_USB_OTG=y
CONFIG_USB_MON=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_ACM=y
CONFIG_USB_WDM=y
# Gadget/Dual-role mode requires USB Gadget support to be enabled
CONFIG_USB_DWC2_DUAL_ROLE=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_USB_SERIAL_KEYSPAN=y
CONFIG_USB_SERIAL_PL2303=y
CONFIG_USB_SERIAL_OTI6858=y
CONFIG_USB_SERIAL_QUALCOMM=y
CONFIG_USB_SERIAL_SIERRAWIRELESS