USB host/device使用说明
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 04/12/2024 |
1. 概述¶
IFADO USB规格是包含USB2.0 Host + Device,USB 2.0 Host和Device各一个,Host和device共用一个UTMI,故Host和Device只能存在一个。硬件不支持USB3.0。
2. 关键词说明¶
EHCI: (Enhanced Host Controller Interface)增强型主机控制器接口规范定义了一个通用串行总线(USB)2.0主机控制器的寄存器级接口
UTMI: 全称为 USB2.0 Transceiver Macrocell Interface,此协议是针对USB2.0的信号特点进行定义的,分为8位或16位数据接口
3. 功能描述¶
-
USB HOST可以支持键盘、鼠标、U盘、USB网卡、USB摄像头、USB耳机等多种设备接入,也支持usb hub接入扩展usb接口数量
-
USB device可以配置成USB摄像头、USB音频采集播放、RNDIS等设备
-
支持USB2.0,兼容多种USB接口,可以支持type A/B 接口。
4. Uboot用法介绍¶
4.1 USB2.0 Host Driver使用¶
4.1.1 USB 2.0 Host menuconfig配置¶
-> [*] SigmaStar drivers --->
-> -*- SigmaStar USB2.0 Host Controller
选中以上选项,开启USB20 host driver。
4.1.2 DTS节点配置¶
sstar_ehci_p0: sstar-ehci-p0@1f284800 {
compatible = "sstar,ehci";
reg = <0x1f284000 0x200>, <0x1f284200 0x200>, <0x1f284400 0x200>, <0x1f284600 0x200>, <0x1f284800 0x200>, <0x1f285200 0x200>;
reg-names = "upll", "utmi", "bc", "usb0", "ehc", "extra_utmi_power";
status = "okay";
};
4.1.3 Uboot dts参数说明¶
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| reg | 用于指定ehci所占用4个bank寄存器地址范围 | 不需要改 |
| reg-names | 用于指定上个选项reg中的name | 不需要改 |
| status | 选择是否使能usb device驱动 | 根据需要修改 |
4.1.4 Uboot cmd使用实例¶
uboot支持的usb class driver并不多,下面就以mass storage为例,编译uboot。
-> Command line interface --->
-> SigmaStar common commands --->
-> SigmaStar usbstar commands --->
-> [*] usbstar
-> [*] usb2.0
跑进uboot之后,在USB20 host port接上U盘,执行:usb start,可以识别到U盘。
4.2 USB2.0 Device Driver使用¶
4.2.1 USB 2.0 Device menuconfig配置¶
-> Device Drivers
->[*] USB support --->
-> [*] Enable driver model for USB Gadget
-> [*] USB Gadget Support --->
-> [*] SigmaStar drivers --->
-> [*] SigmaStar USB 2.0 Device Controller
-> [*] SigmaStar USB Reset Control
以上选中开启USB20 device driver。
4.2.2 DTS节点配置¶
msb250x_udc_p0: sstar-udc-p0@1f284a00 {
compatible = "sstar,msb250x-udc";
reg = <0x1f284000 0x200>, <0x1f284200 0x200>, <0x1f284600 0x200>, <0x1f284a00 0x200>, <0x1f285200 0x200>;
reg-names = "upll", "utmi", "usb0", "otg", "extra_utmi_power";
status = "okay";
};
4.2.3 Uboot DTS参数说明¶
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| reg | 用于指定ehci所占用4个bank寄存器地址范围 | 不需要改 |
| reg-names | 用于指定上个选项reg中的name | 不需要改 |
| status | 选择是否使能usb device驱动 | 根据需要修改 |
4.2.4 Uboot ufu cmd使用实例¶
uboot中使用usb20 device需要结合function driver来使用,下面就以UFU command为例,选中UFU,并在UDC selection中选中USB2.0。
-> Command line interface
-> SigmaStar cmmon commands --->
-> [*] ufu
-> UDC selection (USB2.0 port(msb250x)) --->

跑进uboot之后,执行ufu命令,然后把USB线接到PC端,可以识别到ufu device(如上图所示)。
5. Kernel用法介绍¶
5.1 USB2.0 Host Driver使用¶
5.1.1 USB 2.0 Host menuconfig配置¶
-> Device Drivers
-> [M] USB support --->
-> <M> EHCI HCD (USB 2.0) support
选择上述选项,编译出USB 2.0 Host driver:usb-common.ko usbcore.ko ehci-hcd.ko
-> Device Drivers
-> [*] SStar SoC platform drivers --->
-> <M> Sigmastar USB2 UTMI Transceiver Driver
选择上述选项,编译出:phy-sstar-u2phy.ko。不过推荐做法是这两项都选择builtin,不容易漏掉加载。
5.1.2 DTS节点配置¶
usb2phy1_utmi: utmi@0x1f284200 {
compatible="syscon";
reg = <0x1f284200 0x200>;
reg-io-width = <2>;
};
usb2phy1_bc: bc@0x1f284400 {
compatible="syscon";
reg = <0x1f284400 0x200>;
reg-io-width = <2>;
};
usb2phy1_usbc: usbc@0x1f284600 {
compatible="syscon";
reg = <0x1f284600 0x200>;
reg-io-width = <2>;
};
usb2phy1_uhc: uhc@0x1f284800 {
compatible="syscon";
reg = <0x1f284800 0x200>;
reg-io-width = <2>;
};
sstar_u2phy: sstar-usb2-phy {
compatible = "sstar,u2phy";
#address-cells = <1>;
#size-cells = <1>;
ranges;
status = "ok";
sstar_u2phy1: u2phy1 {
syscon-utmi = <&usb2phy1_utmi>;
syscon-uhc = <&usb2phy1_uhc>;
syscon-usbc = <&usb2phy1_usbc>;
syscon-bc = <&usb2phy1_bc>;
//utmi_dp_dm_swap = <0>;
#phy-cells = <0>;
status = "ok";
};
};
sstar-ehci-1 {
compatible = "sstar-ehci-1";
reg-names = "ehc_base";
reg = <0x1f284800 0x200>;
syscon-utmi = <&usb2phy1_utmi>;
syscon-usbc = <&usb2phy1_usbc>;
syscon-bc = <&usb2phy1_bc>;
//clocks = <&CLK_upll_480m>;
interrupts = <GIC_SPI INT_IRQ_UHC IRQ_TYPE_LEVEL_HIGH>;
phys = <&sstar_u2phy1>;
phy-names = "usb";
support_high_2g_access_patch;
//power-enable-pad = <PAD_GPIO8>;
status = "ok";
};
5.1.3 DTS参数说明¶
5.1.3.1 EHCI dts参数说明
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| syscon-utmi | 用于指定utmi bank的syscon节点,便于使用regmap访问寄存器 | 不需要改 |
| syscon-uhc | 用于指定ehci bank的syscon节点,便于使用regmap访问寄存器,与reg属性相同 | 不需要改 |
| syscon-usbc | 用于指定usbc bank的syncon节点,便于使用regmap访问寄存器 | 不需要改 |
| syscon-bc | 用于指定bc bank的syncon节点,便于使用regmap访问寄存器 | 不需要改 |
| interrupts | 用于指定ehci的中断及触发方式 | 禁止修改 |
| phys | 用于指定ehci所使用的phy列表 | 有需要可以修改,参考注1 |
| phy-names | 用于指定phys属性所支持phy列表的名称,与phy列表对应 | 不需要改 |
| clocks | 用于开启ehci时钟 | 禁止修改 |
| status | 选择是否使能驱动 | 根据需要修改 |
5.1.3.2 phy dts参数说明
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| #address-cells | 用于指定子节点reg属性地址信息所占用的字长(32bit) | 禁止修改 |
| #size-cells | 用于指定子节点reg属性地址范围信息所占的字长(32bit) | 禁止修改 |
| ranges | 用于表示子节点继承#address-cells和#size-cells属性 | 不需要改 |
| status | 选择是否使能驱动 | 根据需要修改 |
5.1.3.3 phy子节点dts参数说明
| 属性值 | 描述 | 备注 |
|---|---|---|
| syscon-utmi | 用于指定utmi bank的syscon节点,便于使用regmap访问寄存器 | 不需要改 |
| syscon-uhc | 用于指定ehci bank的syscon节点,便于使用regmap访问寄存器,与reg属性相同 | 不需要改 |
| syscon-usbc | 用于指定usbc bank的syncon节点,便于使用regmap访问寄存器 | 不需要改 |
| syscon-bc | 用于指定bc bank的syncon节点,便于使用regmap访问寄存器 | 不需要改 |
| syscon-utmi2 | 用于指定utmi2 bank的syncon节点,便于使用regmap访问寄存器 | 不需要改 |
| status | 选择是否使能驱动 | 根据需要修改 |
5.1.4 USB 2.0 Host模块使用¶
按照下列顺序加载(如果有模块选择builtin,请忽略):
insmod usb-common.ko insmod usbcore.ko insmod phy-sstar-u2phy.ko insmod ehci-hcd.ko
5.2 USB2.0 Device Driver使用¶
5.2.1 USB 2.0 Device menuconfig配置¶
-> Device Drivers
->[*] USB support --->
-><*> USB Gadget Support --->
-> USB Peripheral Controller --->
-> <M> Sstar USB 2.0 Device Controller
选择上述选项,编译出USB 2.0 Device driver:usb-common.ko usbcore.ko udc-core.ko udc-msb250x.ko
5.2.2 DTS节点配置¶
msb250x-udc-p0 {
compatible = "sstar,msb250x-udc";
reg = <0x1f284200 0x200>, <0x1f284600 0x200>, <0x1f284a00 0x400>, <0x1f203c00 0x200>;
reg-names = "utmi", "usb0", "otg", "chiptop";
interrupts = <GIC_SPI INT_IRQ_OTG IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "msb250x_udc_p0";
maximum-speed = "high-speed";
ep_name = "ep0", "ep1" , "ep2", "ep3", "ep4", "ep5", "ep6";
ep_maxpkt_limit = <64>, <1024>, <1024>, <64>, <512>, <512>, <64>;
ep_fifo_size = <64>, <8192>, <1024>, <64>, <512>, <512>, <64>;
dma_channel_num = <7>;
status = "okay";
};
5.2.3 DTS参数说明¶
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| reg | 用于指定ehci所占用4个bank寄存器地址范围 | 不需要改 |
| reg-names | 用于指定上个选项reg中的name | 不需要改 |
| interrupts | 用于指定msb250x udc的中断及触发方式 | 禁止修改 |
| interrupt-names | 用于指定msb250x udc的中断名字 | 禁止修改 |
| maximum-speed | USB 2.0未使用 | 不需要改 |
| ep_name | USB 2.0 EP的名字,获取ep有几个 | 禁止修改 |
| ep_maxpkt_limit | 指定各个ep的支持的最大包长度 | 根据需要修改 |
| ep_fifo_size | 指定各个ep的HE FIFO支持的最大长度 | 不需要改 |
| dma_channel_num | 指定各个USB HW DMA有几路 | 禁止修改 |
| status | 选择是否使能usb device驱动 | 根据需要修改 |
5.2.4 USB 2.0 Device模块使用¶
按照下列顺序加载(如果有模块选择builtin,请忽略):
insmod usb-common.ko
insmod udc-core.ko
insmod udc-msb250x.ko
## 6. Debug & FAQ
1. 查看host上所接的所有usb设备
cat /sys/kernel/debug/usb/devices
2. 查看echi host mac所有寄存器
riu_r 0x1424
3. 查看UTMI所有寄存器
riu_r 0x1421
4. 查看udc device mac所有寄存器
riu_r 0x1425
riu_r 0x1426
5. 查看USB 所有寄存器
riu_r 0x1420
riu_r 0x1421
riu_r 0x1422
riu_r 0x1423
riu_r 0x1424
riu_r 0x1425
riu_r 0x1426