使用USB Gadget框架让USB变成串口设备

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 SystemFunction File System以及Gadget Config File SystemGadget File System供用户空间使用Gadget功能,Function File SystemConfig 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&
  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux USB gadget驱动编写有如下几个步骤: 1. 确定USB gadget功能:首先需要确定所需实现的USB gadget功能,例如以USB设备的形式提供存储、网络、音频等服务。这样可以决定需要实现的USB gadget驱动类型和功能。 2. 编写USB驱动框架:基于Linux内核框架,编写USB gadget驱动的基本框架。这包括注册USB gadget驱动和常用的函数接口等。 3. 实现USB gadget子系统:根据所需的功能,实现USB gadget子系统的模块,如存储、网络或音频子系统等。这些子系统需要封装底层的USB通信协议和数据传输,供应用程序调用。 4. 配置USB gadget驱动:根据具体需求,在系统配置文件中进行必要的配置,以启用和配置USB gadget驱动。这包括配置端点、描述符和功能等。 5. 移植和编译:将驱动程序编译成内核模块,然后将其移植到目标设备上。对于嵌入式设备,可能需要修改硬件相关的代码,以适应硬件平台。 6. 测试和调试:编写测试用例,对USB gadget驱动进行测试和调试,确保其正常工作。这包括对设备和主机之间的数据传输进行验证,以及处理异常情况和错误处理。 总之,编写Linux USB gadget驱动需要明确所需实现的功能、基于内核框架编写驱动框架、实现USB gadget子系统、配置以及移植和编译。最后进行测试和调试,确保驱动程序的正常运行。通过以上步骤,可以实现各种USB设备功能的驱动。 ### 回答2: Linux USB gadget驱动是用于实现USB设备的功能的驱动程序。它使得Linux设备可以作为一个USB设备与其他主机进行通信。在编写Linux USB gadget驱动时,需要完成以下几个步骤。 首先,需要确定设备的功能和属性。USB设备可以有多种功能,如储存设备、键盘、鼠标等。根据设备的类型和规格,确定设备的操作和数据传输方式。 其次,在驱动程序中定义设备USB描述符。USB描述符包括设备描述符、接口描述符和端点描述符等,它们是USB协议的一部分,用于描述设备的属性和功能。 然后,在驱动程序中实现设备的相关功能。根据设备的类型和规格,编写相应的功能代码。例如,如果设备是一个键盘,就需要实现按键事件的处理逻辑;如果设备是一个储存设备,就需要实现读写数据的逻辑。 最后,编译和加载驱动程序。使用Linux内核提供的工具链,将驱动程序编译为可执行文件,并将其加载到Linux内核中运行。加载驱动程序后,系统即可识别设备,并根据驱动程序中定义的功能和属性来处理设备的操作和数据传输。 总之,编写Linux USB gadget驱动需要确定设备的功能和属性、定义USB描述符、实现设备的相关功能,最后编译和加载驱动程序。通过这些步骤,我们可以在Linux系统中实现USB设备的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值