USB 通用开发指南
介绍 K1 USB 的的基本功能和配置、使用方法。
适用范围: SpacemiT Linux 6.1, SpacemiT Linux 6.6
模块介绍
K1 共有三个 USB 控制器,分别为 :
- USB2.0 OTG( USB0 )
- USB2.0 Host( USB1 )
- USB3.0 DRD(其中 USB2.0 端口为 USB2 , SuperSpeed 端口为 USB3 )
Linux 中,支持 两种 USB 角色:
- 可以外接 USB 外设的 Host 模式
- 作为 USB 外设可以接入到其他上位机的 Device 模式
功能介绍
USB Host

USB Host 角色驱动框架图可以分为以下几个层次:
- USB Host Controller Driver: 这是 USB 控制器驱动层,负责初始化控制器以及进行底层数据收发操作。
- USB Core Services: 这是核心层,负责抽象出 USB 层次和基于 URB 的传输,并提供接口供上下使用。
- USB Class Driver: 这是 USB 设备功能层,负责实现 USB 设备驱动、 USB 功能驱动,对接内核其他框架(如 HID、 UVC、 Storage 等)。
USB Device

USB Device 角色驱动框架图可以分为以下几个层次:
- USB Device Controller Driver: 这是 USB Device 角色控制器驱动层,负责初始化控制器及进行底层数据收发操作。
- UDC Core: 这是核心层,负责抽象出 USB Device 层次和基于 usb_request 的传输,并提供接口供上下使用。
- Composite: 用于组合多个 USB Device 功能为一个设备,支持用户空间通过 configfs 配置,或者 legacy 驱动硬编码组合好的 Functions。
- Function Driver: 这是 USB Device 功能层,负责实现 USB Device 模式的功能驱动,对接内核其他框架(如存储、 V4L2 、网络等)。
这些层次结构共同构成了 Linux 系统中 USB 子系统的框架,确保了 USB 模块系统中的正常运行和数据传输。
源码结构介绍
USB2.0 OTG 控制器驱动代码位于 drivers/usb 目录下:
drivers/usb
|-- phy/
| |-- phy-k1x-ci-otg.c # OTG 驱动,用于实现 EHCI Host 和 K1X UDC 两种模式驱动切换。
| |-- phy/phy-k1x-ci-usb2.c # PHY 驱动。
|-- host/
| |-- ehci-k1x-ci.c # EHCI Host 模式平台驱动 , 需要和 EHCI Host 驱动组合使用。
|-- gadget/
|-- udc/
|-- k1x_udc_core.c # Device 模式驱动。
USB2.0 HOST 控制器驱动代码位于 drivers/usb 目录下:
drivers/usb
|-- phy/
| |-- phy-k1x-ci-usb2.c # PHY 驱动。
|-- host/
|-- ehci-k1x-ci.c # EHCI Host 模式平台驱动 , 需要和 EHCI Host 驱动组合使用。
USB3.0 DRD 控制器驱动代码位于 drivers/usb 目录下:
drivers/usb
|-- phy/
| |-- phy-k1x-ci-usb2.c # USB3.0 复合端口下的 USB2.0 PHY 驱动。
|-- phy/
| |-- spacemit/
| |-- phy-spacemit-k1x-combphy.c # USB3.0 5Gbps PHY 驱动。
|-- dwc3/
| |-- dwc3-spacemit.c # DWC 平台驱动 , 需要和 DWC3 驱动搭配使用。
其他一些组件代码路径如下:
drivers/
|-- extcon/
| |-- extcon-k1xci.c # MicroUSB Pin 检测连接器驱动 , 需搭配 OTG 驱动、 Extcon 驱动使用。
|-- usb
| |-- misc/
| |-- spacemit_onboard_hub.c # 用于板载 USB 外设供电配置的帮助驱动。
关键特性
USB2.0 OTG
特性
| 特性 | 特性说明 |
|---|---|
| 支持 OTG | 支持 Host 和 Device 模式切换,并支持 idpin+vbuspin 检测。 |
| 支持 HS,FS Host/Device | High Speed(480Mb/s), Full Speed(12Mb/s) Host/Device 模式 |
| 支持 LS Host Only | 支持 Low Speed(1.5Mb/s) Host only 模式 |
| 支持 16 Host Channel | 最多支持 16 Channel 同时传输 |
| 支持 16 IN + 16 OUT Device 端点 | 16KB Tx Buffer, 2KB Rx Buffer |
| 支持 Remote Wakeup | Host 模式下支持 High Speed, Full Speed, Low Speed Remote Wakeup |
性能参数
| 测试项目 | Tx(MB/s) | Rx(MB/s) |
|---|---|---|
| U 盘测速 (HIKISEMI S560 256GB) | 32.2 | 32.4 |
| U 盘模式 Gadget 测速 | 21.8 | 14.8 |
测试方法
# U 盘测速:
## host:
fio -name=Tx -ioengine=libaio -direct=1 -iodepth=64 -rw=write -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
fio -name=Rx -ioengine=libaio -direct=1 -iodepth=64 -rw=read -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
# U 盘模式 Gadget:
## device:
gadget-setup msc
## pc:
fio -name=DevRx -ioengine=libaio -direct=1 -iodepth=64 -rw=write -bs=512K -size=100M -numjobs=1 -group_reporting -filename=/dev/sda
fio -name=DevTx -ioengine=libaio -direct=1 -iodepth=64 -rw=read -bs=512K -size=100M -numjobs=1 -group_reporting -filename=/dev/sda
USB2.0 Host
特性
| 特性 | 特性说明 |
|---|---|
| 支持 HS,FS,LS Host | High Speed(480Mb/s), Full Speed(12Mb/s), Low Speed(1.5Mb/s) Host 模式 |
| 支持 16 Host Channel | 最多支持 16 Channel 同时传输 |
| 支持 Remote Wakeup | Host 模式下支持 HighSpeed, FullSpeed, LowSpeed Remote Wakeup |
性能参数
| 测试项目 | Tx(MB/s) | Rx(MB/s) |
|---|---|---|
| U 盘测速 (HIKISEMI S560 256GB) | 32.2 | 32.4 |
测试方法
# U 盘测速:
fio -name=Tx -ioengine=libaio -direct=1 -iodepth=64 -rw=write -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
fio -name=Rx -ioengine=libaio -direct=1 -iodepth=64 -rw=read -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
USB3.0 DRD
特性
| 特性 | 特性说明 |
|---|---|
| 支持 OTG | 支持 Host 和 Device 模式切换 |
| 支持 SS Host/Device | Super Speed(5Gbps/s) Host/Device 模式 |
| 兼容 HS,FS Host/Device | High Speed(480Mb/s), Full Speed(12Mb/s) Host/Device 模式 |
| 支持 LS Host Only | 支持 Low Speed(1.5Mb/s) Host only 模式 |
| 支持 32 Device 端点 | 支持动态分配 |
| 支持低功耗 | USB2.0 Suspend, USB3.0 U1, U2, U3 |
| 支持 Remote Wakeup | Host 模式下支持 SuperSpeed, HighSpeed, FullSpeed, LowSpeed Remote Wakeup |
性能参数
| 测试项目 | Tx(MB/s) | Rx(MB/s) |
|---|---|---|
| U 盘测速 (HIKISEMI S560 256GB)(SuperSpeed) | 345 | 343 |
| U 盘测速 (HIKISEMI X301 64GB)(HighSpeed) | 27.1 | 30.2 |
| U 盘模式 Gadget 测速 (SuperSpeed) | 349 | 328 |
测试方法
# U 盘测速 :
fio -name=Tx -ioengine=libaio -direct=1 -iodepth=64 -rw=write -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
fio -name=Rx -ioengine=libaio -direct=1 -iodepth=64 -rw=read -bs=512K -size=1024M -numjobs=1 -group_reporting -filename=/dev/sda
# U 盘模式 Gadget 测速 (SuperSpeed):
## device:
USB_UDC=c0a00000.dwc3 gadget-setup uas:/dev/nvme0n1p1
## pc:
fio -name=DevRx -rw=write -bs=512k -size=5G -numjobs=1 -iodepth=32 -group_reporting -direct=1 -ioengine=libaio -filename=/dev/sda
fio -name=DevTx -rw=read -bs=512k -size=5G -numjobs=1 -iodepth=32 -group_reporting -direct=1 -ioengine=libaio -filename=/dev/sda
硬件原理图介绍
这里以 SpacemiT MUSE-Pi 来介绍在进行方案配置开发时,硬件原理图的使用方法。