简单记录一下Linux gadget serial的工作

Linux支持连接各种USB从设备,同时也支持自己作为设备插入到其他主机当中。最典型的例子就是Android OS的手机,插入电脑可以被识别为U盘之类的设备。

对于SOC来说,这部分直接对应了USB Device部分的操作。

为了避免与作为主机时支持的"设备驱动 (USB Device Driver)"一词混淆, Linux给这部分的实现取名为"Gadget",小玩具。内核源码的目录为\drivers\usb\gadget,里面包含了内核所支持的不同类型的USB Device Controller (UDC)驱动的实现,以及框架和不同gadget的实现。

以AT91 ARM9为例,最底层的驱动为at91_udc.c(对于支持高速USB 2.0的SOC是atmel_usba_udc.c),它实现了gadget.h定义的统一接口,然后上层的各种gadget driver(如serial.c等)调用这一套统一的接口去实现不同类型的功能,如USB串口、U盘、USB以太网等等。

Atmel USB串口的框架图:


USB串口的描述和使用方法在内核目录\Documentation\usb\gadget_serial.txt中有详细且清晰的描述,就不再这里重复。一旦加载模块后会自动在/dev/下创建设备文件,程序就可以open它并且write,即使USB线没有连接上。之前一直纠结在为什么g_serial没有向上层提供USB cable connect/disconnect的事件,后来想想在使用串口的时候也是一样的情况,打开一个即使没有连接线的串口,也可以发送数据,只是没有人会收到而已。不过与串口唯一的不同在于,如果通讯正在进行中拔掉USB线,那么再次连接USB线后需要重新open一次ttyGS0设备文件才可以重新发送,否则write不能向串口一样正常工作而返回出错。


参考部分:

官方Gadget框架的描述:http://www.linux-usb.org/gadget/

基于9263的配置过程:http://www.cublog.cn/u3/111925/showart_2278264.html

华清讲师刘洪涛的BLOG:http://blog.csdn.net/hongtao_liu/article/details/4555645



<think>好的,用户现在提供了他们执行 `dmesg | grep -i usb` 后的输出,需要我帮忙分析这些日志,以确定USB设备的版本。首先,我需要回忆之前给出的方法,尤其是通过内核日志中的关键词来判断USB版本的部分。 用户之前的提问是关于如何查看USB是USB几,比如USB 2.0或3.0。现在他们执行了命令,但输出看起来不太明显,没有直接显示常见的“high-speed”或“SuperSpeed”等关键词。这可能意味着他们的嵌入式系统比较特殊,或者驱动信息不够详细。 首先,我应该检查用户提供的日志内容。在输出中,有关于`usb20`的条目,比如`usb20 528 clk get`,这可能提示USB 2.0控制器相关操作。另外,`fotg210_udc`和`g_serial`驱动可能涉及USB设备模式(gadget),但不确定是否直接关联版本信息。 接下来,我需要回顾之前提到的内核日志关键词对照表。例如,“high-speed”对应USB 2.0,“SuperSpeed”对应USB 3.0。但用户提供的日志中没有这些关键词,反而有一些特定的驱动信息和寄存器配置,比如`usb_setEPMaxpktsize`等,这可能属于底层驱动调试信息,而非直接显示版本。 这时候需要思考,是否有其他线索可以推断USB版本。比如,在日志中提到的`usb20`可能直接指向USB 2.0控制器,而`EPMaxpktsize`中设置的最大包大小为1024或36,可能对应于不同速度的端点配置。USB 2.0高速设备的端点最大包大小通常是512字节,但有时也会看到更大的值,特别是用于批量传输的时候。 另外,用户使用的是嵌入式Linux系统,可能硬件比较特殊,比如NVT(可能是某个厂商的芯片),驱动名称如`fotg210_udc`,这可能对应Faraday FOTG210 USB控制器的驱动,而FOTG210通常支持USB 2.0。因此,结合驱动名称和`usb20`的关键词,可以推测该系统使用的是USB 2.0。 不过,用户可能想知道插入的具体设备是什么版本,但根据提供的日志,似乎没有新设备插入的记录。之前的日志可能是在系统启动时的驱动初始化过程,而不是插入外部设备后的识别信息。因此,可能需要用户插入USB设备后再次运行`dmesg`,观察是否有新的日志出现,如“new high-speed USB device”之类的信息。 此外,用户可能需要安装`usbutils`工具包来使用`lsusb`命令,或者检查`/sys`文件系统中的信息,如`/sys/bus/usb/devices/*/speed`,以获取实际的速度值。如果系统中没有这些工具或文件,可能需要交叉编译或启用内核配置。 总结来说,根据现有的日志,虽然没有明确的版本标识,但通过驱动名称和`usb20`的关键词,可以推断系统主要支持USB 2.0。建议用户插入设备后再次检查日志,或使用其他方法验证。</think>根据你提供的 `dmesg` 日志内容,目前输出中**未直接显示USB设备的版本信息**(如USB 2.0或3.0),但可以从以下线索推断系统USB控制器的配置和状态: --- ### **关键日志解析** #### **1. USB控制器初始化** ```bash [ 3.817321] usb20 528 clk get [ 44.971448] usb20 528 clk get ``` - **`usb20`**:表明系统使用了**USB 2.0控制器**(可能是硬件设计或驱动命名约定)。 - `clk get`:表示初始化时获取时钟配置,属于底层硬件操作。 #### **2. USB Gadget(设备模式)驱动** ```bash [ 15.467852] fotg210_udc f0600000.nvt_usb2dev: version 30-April-2013 [ 15.557260] udc f0600000.nvt_usb2dev: registering UDC driver [g_serial] ``` - **`fotg210_udc`**:驱动名称指向 **Faraday FOTG210 USB控制器**(常见于嵌入式设备),通常支持**USB 2.0协议**。 - **`g_serial`**:Linux的USB Gadget驱动,用于将设备模拟为串口(CDC ACM)。 #### **3. 端点(Endpoint)配置** ```bash [ 47.094654] USB_setFIFOCfg:FIFO=0 BLK_TYP=1 BLKNO=2 BLKSZ=1 [ 47.100444] usb_setEPMaxpktsize:EP1 Dir=1 MaxPkt=1024 [ 47.106760] USB_setFIFOCfg:FIFO=4 BLK_TYP=1 BLKNO=1 BLKSZ=0 [ 47.112519] usb_setEPMaxpktsize:EP3 Dir=1 MaxPkt=36 ``` - **`MaxPkt=1024`**:USB 2.0高速(High-Speed)模式下批量传输(Bulk Transfer)的典型最大包大小。 - **`MaxPkt=36`**:可能用于中断传输(Interrupt Transfer)或低速设备(如USB 1.1)。 --- ### **初步结论** 1. **USB控制器版本**: 根据`usb20`和`fotg210_udc`驱动名称,系统使用的USB控制器**支持USB 2.0协议**(最高480Mbps)。 2. **未检测到外接USB设备**: 当前日志中**未出现类似`new high-speed USB device`的记录**(如插入U盘或外设时的热插拔事件),推测未连接外部USB设备或驱动未正确识别。 --- ### **下一步排查建议** #### **1. 插入USB设备后重新检查日志** - 插入U盘或其他USB设备,再次执行: ```bash dmesg | tail -n 20 | grep -i usb ``` - 观察是否有类似以下关键字段: ```bash usb 1-1: new high-speed USB device # USB 2.0 usb 2-1: new SuperSpeed USB device # USB 3.0+ ``` #### **2. 检查`/sys`文件系统** - 通过路径查看实际速度(需插入设备): ```bash cat /sys/bus/usb/devices/<设备目录>/speed # 输出480 → USB 2.0 ``` #### **3. 验证驱动兼容性** - 若日志中持续出现`usb2dev_close:driver not opened`等错误,可能是驱动未正确加载,需检查内核配置或驱动模块: ```bash lsmod | grep nvt_usb # 确认驱动模块已加载 ``` --- ### **嵌入式系统特殊性** - **硬件限制**: 嵌入式设备(如NVT平台)可能仅支持USB 2.0,需参考硬件手册确认。 - **驱动定制**: `fotg210_udc`和`g_serial`为定制驱动,部分功能可能依赖厂商提供的SDK。 如果需要进一步定位,请插入USB设备后提供新的日志!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值