1. USB OTG接口的双重角色解析第一次拿到盈鹏飞SBC-T113开发板时最让我惊喜的就是那个Type-A形态的USB OTG接口。这种设计在嵌入式领域相当少见——大多数开发板的OTG接口都是Micro-USB或Type-C。这个细节其实已经暗示了OTG功能在这块板子上的重要性。USB OTGOn-The-Go技术的精髓在于动态切换主机Host和设备Device角色。当SW3拨到2-3位置时CN4接口就变成了一个标准的USB主机端口。我实测连接U盘、鼠标等外设都能即插即用内核日志里能看到熟悉的设备识别过程[ 171.744035] usb 3-1: new high-speed USB device number 2 using sunxi-ehci [ 171.958976] scsi host0: usb-storage 3-1:1.0而在1-2位置时它就变成了一个USB从设备。这时通过Type-A to Type-A线缆连接电脑开发板会模拟成ADB设备。这种物理切换的设计比软件切换更可靠我在连续工作72小时的稳定性测试中从未出现过模式混淆的情况。全志T113-i的OTG控制器支持HighSpeed480Mbps传输实测ADB文件传输速度能达到35MB/s左右。有个细节值得注意当切换模式时内核会先卸载原有驱动再加载新驱动从串口日志能看到完整的清理过程[ 151.223171] usb usb3: USB disconnect, device number 1 [ 151.231433] sunxi-ehci 4101000.ehci0-controller: USB bus 3 deregistered2. 硬件切换的实操指南SW3这个小小的拨码开关藏着不少门道。位于开发板边缘的这个三脚开关其物理状态直接决定了USB控制器的初始模式Host模式2-3使能EHCI/OHCI主机控制器驱动此时接口可提供500mA电流输出。我测试过同时接U盘和USB网卡也没问题但建议外接供电超过1A的HUB使用大功率设备。Device模式1-2激活USB Gadget功能此时接口最大消耗电流不能超过500mA。实际测量待机电流约120mA传输文件时峰值到300mA左右。切换时需要特别注意先断开所有USB连接拨动SW3到目标位置等待串口出现驱动加载完成日志重新连接设备常见问题排查如果切换后设备无反应检查dmesg | grep usb是否有错误日志出现power supply failed警告时很可能是供电不足模式切换失败时可以尝试重启板子3. ADB文件传输全攻略在Device模式下ADB堪称嵌入式开发的瑞士军刀。要让SBC-T113支持ADB需要确认三个关键点内核配置确保编译时开启了CONFIG_USB_F_ADB选项启动脚本/etc/init.d/rcS中需要包含/etc/adb_conf.sh start权限设置/dev/usb-ffs/adb目录权限应为666连接电脑后理想的日志输出应该是这样的[ 203.928644] configfs-gadget gadget: high-speed config #1: c [ 203.935258] android_work: sent uevent USB_STATECONFIGURED如果遇到设备无法识别可以尝试以下命令手动启动ADB服务mkdir -p /dev/usb-ffs/adb mount -t functionfs adb /dev/usb-ffs/adb adbd 文件传输实战技巧推送整个目录adb push local_dir /remote_dir保留文件属性adb push -p file.txt /tmp/限速传输适合调试adb push -l 1024 largefile.iso /sdcard/我常用的组合命令示例# 批量推送头文件到开发板 find ./include -name *.h -exec adb push {} /usr/include \; # 从开发板拉取日志 adb pull /var/log ./logs # 实时查看内核打印 adb shell cat /proc/kmsg4. 深入OTG驱动机制全志T113-i的USB控制器架构很有意思。从内核日志可以看到它实际上包含两个独立的控制器[ 171.102004] sunxi-ehci 4101000.ehci0-controller: irq 60, io mem 0x04101000 [ 171.220488] sunxi-ohci 4101400.ohci0-controller: irq 61, io mem 0x04101400EHCI高速和OHCI全/低速控制器分别管理不同速率的设备。当切换模式时内核会通过sunxi_usb_disable_ehci/sunxi_usb_enable_ehci这两个底层函数来操作硬件寄存器。在ADB传输过程中可以通过proc文件系统监控实时状态cat /proc/interrupts | grep ehci cat /proc/bus/usb/devices性能优化建议调整ADB缓冲区大小echo 16384 /sys/class/usb_composite/adb/read_q_length关闭内核打印减少延迟echo 0 /proc/sys/kernel/printk使用noop调度器提升吞吐量echo noop /sys/block/loop0/queue/scheduler5. 实战中的坑与解决方案在三个月的高强度使用中我总结了几个典型问题问题1ADB连接时断时续原因USB线缆质量差导致高速信号衰减解决更换带屏蔽层的优质线缆长度不超过1米问题2大文件传输失败现象传输超过100MB文件时ADB崩溃排查adb logcat | grep UsbDeviceManager方案修改/etc/adb_conf.sh增加-B 32参数限制缓冲区数量问题3Host模式无法识别某些设备典型场景某些U盘在OHCI控制器下工作不正常调试方法lsusb -v查看设备描述符终极方案强制使用EHCI模式echo 1 /sys/bus/usb/devices/usb1/1-1/bConfigurationValue问题4同时使用OTG和HOST端口硬件限制T113-i的OTG和HOST共用PHY变通方案通过USB HUB扩展但总带宽仍受限6. 扩展应用场景除了基础的文件传输OTG接口还能玩出更多花样虚拟串口# 开发板端 modprobe g_serial # 主机端 screen /dev/ttyACM0 115200USB网络共享# 开发板端 modprobe g_ether ifconfig usb0 192.168.7.2 # 主机端 ifconfig usb0 192.168.7.1大容量存储# 将NAND分区暴露为U盘 modprobe g_mass_storage file/dev/nanda removable1对于需要频繁切换模式的场景可以编写自动化脚本#!/bin/bash # 切换为Host模式 echo host /sys/kernel/debug/usb/ci_hdrc.0/role # 加载驱动 modprobe ehci-hcd modprobe ohci-hcd在工业现场我们甚至用OTG接口实现了固件无线升级——通过手机APP连接开发板OTA升级这比传统串口升级快10倍以上。