在Linux系统中配置OTG(On-The-Go)USB功能,可以让设备在主机(Host)和外设(Device)模式间灵活切换,实现如U盘互传、键盘鼠标连接、串口通信等场景,以下是详细的配置步骤,涵盖硬件准备、驱动加载、模式切换及实际应用场景。

硬件准备与基础检查
支持OTG的硬件
- 主控芯片:需内置OTG控制器,常见的有树莓派(BCM283x/2711)、全志H3、RK3399等开发板,部分手机SOC(如高通、联发科)也支持。
- 接口类型:需为Micro-USB(OTG专用)或USB-C接口(支持OTG功能),普通USB-A口不支持OTG。
- OTG线材:使用OTG转接线(如Micro-USB转USB-A、USB-C转USB-A),确保线材支持数据传输(部分仅充电的OTG线无数据功能)。
系统环境要求
- 内核版本:Linux内核需≥3.0(推荐4.0+),内置OTG驱动(如
CONFIG_USB_OTG、CONFIG_USB_MUSB_HDRC等)。 - 工具安装:安装必要的命令行工具,如
lsusb(识别USB设备)、dmesg(查看内核日志)、usb-devices(USB设备详情)。sudo apt update && sudo apt install usbutils # Debian/Ubuntu sudo pacman -S usbutils # Arch Linux
OTG功能配置步骤
检查内核是否支持OTG
通过以下命令确认内核是否加载了OTG相关驱动:
dmesg | grep -i "otg" # 查看OTG初始化日志 lsmod | grep -E "musb|dwc2|ehci" # 检查OTG控制器驱动(如musb_host、dwc2)
若输出为空,需重新编译内核或安装对应驱动模块(如sudo modprobe musb-hdrc)。
硬件连接与设备识别
- 连接OTG设备:将OTG线一端接开发板OTG口,另一端接USB设备(如U盘、键盘)。
- 检测设备:
lsusb # 列出所有USB设备 usb-devices # 查看USB设备树形结构 dmesg | grep -i "usb" | tail -n 10 # 查看USB设备插入日志
若识别到设备(如U盘显示为“Mass Storage Device”),说明硬件连接正常;若未识别,检查OTG线或设备兼容性。
主机模式配置(识别U盘/键盘等)
OTG默认为外设模式,需切换到主机模式才能识别USB存储设备或输入设备。

- 方法1:通过sysfs接口切换(推荐)
创建host文件触发模式切换:echo "host" > /sys/bus/platform/devices/usb-otg/otg_mode # 路径因设备而异,需通过dmesg确认
若路径不存在,可通过以下命令查找OTG控制器节点:
find /sys -name "otg_mode" 2>/dev/null
- 方法2:使用usb-gadget工具(需安装)
sudo apt install glib2.0 libgudev-1.0-dev # 安装依赖 git clone https://github.com/adafruit/Adafruit_Python_GPIO.git cd Adafruit_Python_GPIO && sudo python setup.py install
通过脚本切换模式后,重新插拔设备。
设备模式配置(作为U盘/串口被识别)
若需将开发板配置为U盘(如树莓派被电脑识别为存储设备),需使用usb-gadget框架。
- 以树莓派为例(Raspbian系统):
- 安装
gadgetfs模块:sudo modprobe libcomposite
- 创建gadget配置脚本(如
/usr/local/bin/otg-gadget.sh):#!/bin/bash cd /sys/kernel/config/usb_gadget/ mkdir -p g1 && cd g1 echo 0x1d6b > idVendor # Linux Foundation Vendor ID echo 0x0104 > idProduct # Gadget Advertised Product ID echo 0x0100 > bcdDevice # Device version 1.00 echo 0x0200 > bcdUSB # USB 2.0 mkdir -p strings/0x409 # 英文描述 echo "Linux Gadget" > strings/0x409/manufacturer echo "USB Mass Storage" > strings/0x409/product mkdir -p functions/mass_storage.0 echo 1 > functions/mass_storage.0/lun.0/removable echo 1 > functions/mass_storage.0/lun.0/ro mkdir -p configs/c.1 echo "500" > configs/c.1/MaxPower ln -s functions/mass_storage.0 configs/c.1/ ls /sys/class/udc > UDC # 绑定到第一个USB控制器
- 赋予执行权限并运行:
sudo chmod +x /usr/local/bin/otg-gadget.sh sudo /usr/local/bin/otg-gadget.sh
将开发板通过OTG线连接电脑,电脑会识别为一个可移动磁盘。

- 安装
文件系统挂载(主机模式识别U盘后)
若OTG主机模式识别到U盘,需手动挂载文件系统:
- 查找U盘设备名:
lsblk -f # 查看块设备及文件系统类型 dmesg | grep "sd" | tail -n 5 # 查看新识别的存储设备(如sda1)
- 创建挂载目录并挂载:
sudo mkdir -p /mnt/usb_drive sudo mount /dev/sda1 /mnt/usb_drive # 假设U盘分区为sda1
- 卸载时使用:
sudo umount /mnt/usb_drive
常见问题排查
| 问题现象 | 可能原因及解决方法 |
|---|---|
| OTG设备无法识别 | 检查OTG线是否支持数据传输(非充电线); 确认内核驱动已加载( sudo modprobe xxx);尝试切换OTG模式(设备/主机)。 |
| 挂载U盘时提示“未识别文件系统” | 使用sudo fsck /dev/sda1修复文件系统;尝试 sudo mount -t vfat /dev/sda1 /mnt/usb_drive(指定文件系统类型,如vfat/ntfs)。 |
| usb-gadget脚本执行失败 | 检查/sys/kernel/config/usb_gadget目录是否存在(需configfs支持);确认内核已启用 CONFIG_USB_CONFIGFS和CONFIG_USB_CONFIGFS_FTS。 |
相关问答FAQs
Q1:Linux OTG配置时,设备无法识别,但OTG线在其他设备上正常使用,怎么办?
A:首先通过dmesg | grep -i "usb"查看内核日志,确认是否有设备插入的记录,若无,可能是开发板OTG控制器未启用,检查设备树(如树莓派的config.txt)或BIOS设置中是否开启OTG功能,若日志显示“device not accepting address”,尝试更换电源(部分设备供电不足会导致无法识别)。
Q2:如何在OTG设备模式下实现串口通信(如通过USB-C口连接电脑串口)?
A:需使用usb-gadget中的serial功能,在/sys/kernel/config/usb_gadget/g1/functions/下创建serial.acm0节点,并绑定到配置中,具体步骤:
- 创建串口gadget:
cd /sys/kernel/config/usb_gadget/g1/functions/ mkdir -p acm.gs0 echo 1 > acm.gs0/port_num ln -s acm.gs0 configs/c.1/
- 绑定到UDC:
ls /sys/class/udc > UDC。 - 电脑端会识别出一个串口设备(如
/dev/ttyACM0),使用minicom或screen工具连接即可实现串口通信。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/28294.html