USB
介绍 USB 的功能和使用方法。
模块介绍
USB 全称 Universal Serial Bus(通用串行总线),是一种新兴的并逐渐取代其他接口 标准的数据通信方式,由 Intel、Compaq、Digital、IBM、Microsoft、NEC 及 Northern Telecom 等计算机公司和通信公司于1995年联合制定,并逐渐形成了行业标准。
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
配置介绍
主要包括 驱动使能配置 和 DTS 配置
USB2.0 OTG 配置介绍
CONFIG 配置
CONFIG_K1XCI_USB2_PHY
为 USB2.0 OTG 的 PHY 提供支持,默认 Y
。
Device Drivers
-> USB support (USB_SUPPORT [=y])
-> USB Physical Layer drivers
-> K1x ci USB 2.0 PHY Driver (K1XCI_USB2_PHY [=y])
CONFIG_USB_K1X_UDC
为 USB2.0 OTG 的 Device 功能提供支持,默认 Y
。
Device Drivers
-> USB support (USB_SUPPORT [=y])
-> USB Gadget Support (USB_GADGET [=y])
-> USB Peripheral Controller
-> Spacemit K1X USB2.0 Device Controller (USB_K1X_UDC [=y])
CONFIG_USB_EHCI_K1X
为 USB2.0 OTG 的 Host 功能提供支持,默认 Y
。
Device Drivers
-> USB support (USB_SUPPORT [=y])
-> EHCI HCD (USB 2.0) support (USB_EHCI_HCD [=y])
-> EHCI support for Spacemit k1x USB controller (USB_EHCI_K1X [=y])