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