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 Port记为USB2、SuperSpeed Port记为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])
CONFIG_USB_K1XCI_OTG为USB2.0 OTG的OTG角色切换提供支持,默认Y。
Device Drivers
-> USB support (USB_SUPPORT [=y])
-> USB Physical Layer drivers
-> Spacemit K1-x USB OTG support (USB_K1XCI_OTG [=y])
CONFIG_EXTCON_USB_K1XCI为USB2.0 OTG用于MicroUSB接口的的ID Pin+Vbus Pin检测连接器驱动提供支持,默认Y。
Device Drivers
-> External Connector Class (extcon) support (EXTCON [=y])
-> Spacemit K1-x USB extcon support (EXTCON_USB_K1XCI [=y])
DTS配置
USB2.0 OTG支持4种配置模式,通常情况下配置为以Device Only模式工作。
如果支持手动切换Host,推荐配置为 以OTG模式工作(基于usb-role-switch) 并且配置为默认Device角色。
如果支持自动切换双角色(如Type-C OTG接口),推荐配置为以OTG模式工作(基于usb-role-switch),并接入Type-C驱动或者GPIO检测。
以Device Only 模式工作
USB2.0 OTG 控制器 device 模式对应的设备树节点为 udc
,作为 device 模式工作时, 需要配置 dts
- disable
ehci
节点。 - enable
usbphy
节点。 - udc节点的
spacemit,udc-mode
属性为MV_USB_MODE_UDC
来选择 device 模式。
方案 dts 配置如下:
&usbphy {
status = "okay";
};
&udc {
spacemit,udc-mode = <MV_USB_MODE_UDC>;
status = "okay";
};
&ehci {
status = "disabled";
};
以Host Only模式工作
USB2.0 OTG 控制器 host 模式对应的设备树节点为 ehci
,作为 host 模式工作时,可以通过 dts 配置:
- disable
udc
节点。 ehci
节点的spacemit,udc-mode
属性为MV_USB_MODE_HOST
(默认值)来选择 host 模式。- 如果host需要适用GPIO控制vbus开关,可以使用spacemit_onboard_hub驱动配置。
- 可选属性
spacemit,reset-on-resume
,用于控制系统休眠唤醒后是否reset控制器。
&usbphy {
status = "okay";
};
&udc {
status = "disabled";
};
&ehci {
spacemit,reset-on-resume;
spacemit,udc-mode = <MV_USB_MODE_HOST>;
status = "okay";
};