USB 主机与设备驱动
1. 概述
1.1 功能简介
USB(Universal Serial Bus)通用串行总线,是嵌入式系统中最常用的外设接口之一。RK3576 内置多路 USB 控制器,支持 USB 2.0(480Mbps)和 USB 3.0(5Gbps)标准,支持主机(Host)和设备(Device)模式,可用于连接 U 盘、键盘鼠标、摄像头、USB 转串口模块等外设。
1.2 应用场景
- USB Host:连接 U 盘、移动硬盘、USB 键盘鼠标
- USB Device:设备作为 USB 从设备,实现 USB 网络、串口、存储等功能
- USB OTG:支持 Host/Device 动态切换(如 Type-C 接口)
- USB 转串口:连接 CH340/CP2102/FT232 等 USB 转串口模块
- USB 摄像头:连接 UVC 兼容 USB 摄像头
1.3 工作原理
RK3576 的 USB 控制器支持以下特性:
| 特性 | 说明 |
|---|---|
| USB 2.0 | 最高 480Mbps,支持 Host/Device |
| USB 3.0 | 最高 5Gbps,支持 Host |
| OTG | 支持 Host/Device 动态切换 |
| 端点 | 最多 16 个 IN + 16 个 OUT 端点 |
| DMA | 支持 DMA 传输,减少 CPU 负载 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| USB U 盘 | 任意 USB 2.0/3.0 U 盘 | 1 | 用于 Host 测试 |
| USB 线 | Type-A / Type-C | 1 | 用于 Host/Device 测试 |
| USB 键盘/鼠标(可选) | USB HID 设备 | 1 | 用于 Host 测试 |
2.2 引脚连接
USB Host(Type-A)
底板上通常已集成 USB Type-A 接口,直接插入 U 盘即可。M4-R2 底板具体的 USB 接口数量与类型以实际物料为准(待板上验证)。
USB Device(Type-C)
底板上 Type-C 接口同时支持 Host 和 Device 模式:
| 主控板引脚 | Type-C 引脚 | 功能说明 |
|---|---|---|
| USB3.0_DP0 | TX1 | USB 3.0 发送 |
| USB3.0_DM0 | TX2 | USB 3.0 接收 |
| USB2.0_DP0 | D+ | USB 2.0 数据+ |
| USB2.0_DM0 | D- | USB 2.0 数据- |
| 5V | VBUS | USB 电源 |
| GND | GND | 共地 |
2.3 硬件确认
# 查看 USB 控制器
lsusb
# 输出示例:Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# 查看 USB 设备详情
lsusb -v
# 查看 USB 存储设备
lsblk | grep sd3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_OF_SIMPLE=y
CONFIG_USB_STORAGE=y
CONFIG_USB_UAS=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_CH341=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y
CONFIG_OF=y3.2 设备树
RK3576 的 USB 控制器在设备树中定义(以下为 RK 平台通用结构示例):
usb_host0_ehci: usb@fd800000 {
compatible = "generic-ehci";
reg = <0x0 0xfd800000 0x0 0x20000>;
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USB2HOST0>, <&cru Clk_USB2HOST0_REF>;
clock-names = "usb", "ref_clk";
phys = <&u2phy0_otg>;
phy-names = "usb-phy";
status = "disabled";
};
usb3otg0: usb@fce80000 {
compatible = "rockchip,rk3576-dwc3", "rockchip,rk3568-dwc3";
reg = <0x0 0xfce80000 0x0 0x10000>;
resets = <&cru SRST_A_USB3OTG0>, <&cru SRST_USB3OTG0>;
reset-names = "usb3-otg", "usb3-otg-upstream";
clocks = <&cru CLK_USB3OTG0_REF>, <&cru CLK_USB3OTG0_SUSPEND>,
<&cru ACLK_USB3OTG0>, <&cru CLK_UTMI_OHCI_USB3OTG0>;
clock-names = "ref_clk", "suspend_clk",
"aclk_u3", "hclk_u3";
phys = <&u2phy0_otg>, <&usb2phy0>;
phy-names = "usb-phy", "u2phy";
dr_mode = "otg";
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 USB Host 模式测试
# 插入 U 盘后查看
lsusb
lsblk
# 挂载 U 盘
mkdir -p /mnt/usb
mount /dev/sda1 /mnt/usb
# 读写测试
ls /mnt/usb/
dd if=/dev/zero of=/mnt/usb/test.bin bs=1M count=10
cat /mnt/usb/test.bin > /dev/null
# 卸载 U 盘
umount /mnt/usb4.2 USB Device 模式测试
# 加载 USB gadget 配置
modprobe libcomposite
# 创建 USB gadget(以 USB 串口为例)
cd /sys/kernel/config/usb_gadget
mkdir g_serial
cd g_serial
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
mkdir configs/c.1
mkdir functions/acm.usb0
ln -s functions/acm.usb0 configs/c.1/
echo "ff500000.usb3otg0" > UDC
# 检查 USB 设备
lsusb4.3 USB OTG 模式切换
# 查看当前 OTG 模式
cat /sys/class/udc/ff500000.usb3otg0/current_role
# 输出:host 或 peripheral
# 手动切换为 Device 模式
echo peripheral > /sys/class/udc/ff500000.usb3otg0/current_role
# 切换为 Host 模式
echo host > /sys/class/udc/ff500000.usb3otg0/current_role以上 UDC 名称(
ff500000.usb3otg0)为示例,实际名称以板卡 sysfs 输出为准。
4.4 通过 debugfs 查看 USB 信息
# 查看 USB 控制器状态
cat /sys/kernel/debug/usb/devices
# 查看 USB 电源管理
cat /sys/bus/usb/devices/usb1/power/runtime_status5. 代码详解
5.1 内核中 USB 驱动的注册
// RK3576 USB3.0 OTG 控制器驱动(简化)
// drivers/usb/dwc3/dwc3-rockchip.c
static struct platform_driver rockchip_dwc3_driver = {
.probe = rockchip_dwc3_probe,
.remove = rockchip_dwc3_remove,
.driver = {
.name = "rockchip-dwc3",
.of_match_table = rockchip_dwc3_match,
},
};
static const struct of_device_id rockchip_dwc3_match[] = {
{ .compatible = "rockchip,rk3576-dwc3" },
{ /* sentinel */ }
};5.2 用户空间 USB 操作的内核调用链
用户空间 lsusb
→ usb_dev_open()
→ usb_enumerate_device()
→ usb_get_device_descriptor()
→ usb_get_string_descriptor()
→ 获取 USB 设备信息6. 常见问题
6.1 USB 设备无法识别
现象: 插入 U 盘后 lsusb 无输出
解决方案:
# 检查 USB 控制器是否正常
dmesg | grep -i usb
# 检查 USB 电源管理
echo on > /sys/bus/usb/devices/usb1/power/control
# 检查 USB 时钟
cat /sys/kernel/debug/clk/clk_usb3otg0_ref/clk_rate确认设备树中 USB 节点 status = "okay",检查 VBUS 电源(5V)是否正常。
6.2 USB 传输速度慢
现象: USB 3.0 设备只有 USB 2.0 速度
解决方案:
# 检查 USB 连接速度
lsusb -t
# 输出应显示 SuperSpeed(5Gbps)
# 检查 USB 3.0 PHY 状态
# 具体 debugfs 路径以实际板卡输出为准
cat /sys/kernel/debug/usb/ff500000.usb3otg0/phy确认 USB 数据线支持 USB 3.0(SS 信号完整),检查 PHY 配置。
6.3 USB 设备频繁断连
现象: USB 设备反复断开重连
解决方案:
# 查看 USB 错误日志
dmesg | grep -i "usb.*error\|usb.*disconnect"
# 禁用 USB 自动挂起
echo -1 > /sys/bus/usb/devices/usb1/power/autosuspend检查 USB 供电是否稳定(5V/500mA),排查数据线质量。
