简单记录一下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.youkuaiyun.com/hongtao_liu/article/details/4555645



您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

Linux系统下USB OTG设备无法正常识别的问题,通常涉及硬件配置、内核模块加载、设备树设置以及电源管理等多个方面。以下是一些常见的排查与修复方法。 ### 1. 检查设备连接和物理状态 确保USB OTG设备的物理连接稳定,并且没有损坏。尝试更换不同的OTG线缆或设备进行测试,以排除硬件故障的可能性。 ### 2. 查看系统日志 使用 `dmesg` 或 `journalctl` 命令查看内核日志,确认是否检测到OTG设备插入事件: ```bash dmesg | grep -i usb ``` 观察输出中是否有类似 `new high-speed USB device number X using xhci_hcd` 的信息。如果没有相关记录,说明设备未被正确识别,可能与控制器驱动有关[^1]。 ### 3. 确认OTG模式配置 Linux内核支持多种USB模式(如Host-only、Peripheral-only、Dual-role/OTG)。需要检查设备树(Device Tree)中的配置是否启用了OTG模式。 例如,在 `.dts` 文件中应包含如下节点: ```dts &usb { dr_mode = "otg"; status = "okay"; }; ``` 然后重新编译并更新设备树镜像(`.dtb`),重启后验证是否生效。 ### 4. 加载必要的内核模块 确保以下与USB OTG相关的内核模块已加载: - `dwc2` - `g_ether` / `g_mass_storage` (取决于设备功能) - `udc-core` - `ci_hdrc_usb2` 可以使用以下命令手动加载模块: ```bash modprobe dwc2 modprobe g_ether ``` 也可以将这些模块添加到 `/etc/modules-load.d/usb.conf` 中,使其在启动时自动加载。 ### 5. 配置USB Gadget功能 如果设备作为USB Peripheral运行,需通过configfs配置USB gadget功能: ```bash mount none -t configfs /sys/kernel/config mkdir /sys/kernel/config/usb_gadget/my_gadget cd /sys/kernel/config/usb_gadget/my_gadget echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget mkdir strings/0x409 echo "fedcba9876543210" > strings/0x409/serialnumber echo "Manufacturer" > strings/0x409/manufacturer echo "My Gadget" > strings/0x409/product mkdir configs/c.1/strings/0x409 echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/bmAttributes echo 200 > configs/c.1/MaxPower mkdir functions/ecm.usb0 ls /sys/class/net # 查看生成的网络接口 ln -s functions/ecm.usb0 configs/c.1/ echo dwc2 > UDC ``` 以上配置创建了一个ECM网络设备,可用于主机端识别为以太网接口[^1]。 ### 6. 检查UDC(USB Device Controller)绑定 确保正确的UDC驱动已绑定到gadget系统中: ```bash cat /sys/kernel/config/usb_gadget/my_gadget/UDC ``` 若无输出或提示“Operation not permitted”,则需要检查设备树配置和内核支持。 ### 7. 更新固件和内核版本 某些旧版Linux内核对特定SoC的OTG支持不完善,建议升级至较新的长期支持(LTS)版本,如Kernel 5.10及以上。同时,确认SoC厂商提供的专有固件(如 `firmware-imx`)已安装。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值