Rockchip Developer Guide Linux4.4 USB
Rockchip-Developer-Guide-linux4.4-USB
Rockchip-Developer-Guide-linux4.4-USB
Rockchip-Developer-Guide-linux4.4-USB
Rockchip-Developer-Guide-linux4.4-USB
Rockchip-Developer-Guide-linux4.4-USB
User Manual:
Open the PDF directly: View PDF .
Page Count: 47
Download | |
Open PDF In Browser | View PDF |
USB开发指南 发布版本:1.0 作者邮箱:wulf@rock-chips.com、frank.wang@rock-chips.com、daniel.meng@rockchip.com 日期:2017.12 文档密级:公开资料 前言 概述 产品版本 芯片名称 内核版本 RK3399、RK3368、RK3366、RK3328、RK3288、RK312X、RK3188、RK30XX Linux4.4 读者对象 软件工程师,硬件工程师,FAE 修订记录 日期 版本 作者 2017-12-22 v1.0 吴良峰、王明成、孟东阳 USB开发指南 1 概述 1.1 RK平台USB控制器方案 1.2 USB2.0 Host 1.3 USB2.0 OTG 1.4 USB2.0 PHY 1.5 USB OTG3.0 1.6 TypeC PHY 2 硬件电路及信号 2.1 USB HOST控制器硬件电路 2.1.1 USB2.0 HOST控制器硬件电路 2.2 USB OTG控制器硬件电路 2.2.1 USB 2.0 OTG控制器硬件电路 2.2.2 USB 3.0 OTG控制器硬件电路 3 Kernel模块配置 3.1 USB PHY相关配置 3.2 USB HOST相关配置 修改说明 3.3 USB OTG相关配置 3.4 USB Gadget配置 3.5 USB其它模块配置 3.5.1 Mass Storage Class(MSC) 3.5.2 USB Serial Converter 3.5.3 USB HID 3.5.4 USB Net 3.5.5 USB Camera 3.5.6 USBAudio 3.5.7 USBHUB 3.5.8 其他USB设备配置 4 Device Tree开发 4.1 USB PHY DTS 4.1.1 USB2.0 PHY DTS 4.1.2 USB3.0 PHY DTS 4.2 USB2.0 Controller DTS 4.2.1 USB2.0 HOST Controller DTS 4.2.2 USB2.0 otg Controller DTS 4.3 USB3.0 Controller DTS 4.3.1 USB3.0 HOST Controller DTS 4.3.2 USB3.0 OTG Controller DTS 5 驱动开发 5.1 USB PHY drivers 5.1.1 USB2.0 PHY driver 5.1.2 USB3.0 PHY driver 5.2 USB Controller drivers 5.2.1 USB3.0 OTG drivers 5.2.2 USB2.0 OTG drivers 5.2.3 USB2.0 HOST drivers 6 Android Gadget配置 6.1 Gadget驱动配置 6.2 BOOT IMG配置 7 常见问题分析 7.1 设备枚举日志 7.1.1 USB2.0 OTG正常开机日志 7.1.2 USB2.0 Device连接 7.1.3 USB2.0 Device断开连接 7.1.4 USB2.0 HOST-LS设备 7.1.5 USB2.0 HOST-FS设备 7.1.6 USB2.0 HOST-HS设备 7.1.7 USB2.0 HOST-LS/FS/HS设备断开log 7.1.8 USB3.0 Device连接 7.1.9 USB3.0 HOST-SS设备 7.2 USB 常见问题分析 7.2.1 软件配置 7.2.2 硬件电路 7.2.3 Device功能异常分析 7.2.4 Host功能异常分析 7.2.5 USB Camera异常分析 7.2.6 USB充电检测 7.3 PC驱动问题 8 USB信号测试 1 概述 1.1 RK平台USB控制器方案 Rockchip SOC通常内置多个USB控制器,不同控制器互相独立,请在芯片TRM中获取详细信息。由于部分USB控 制器有使用限制,所以请务必明确方案的需求及控制器限制后,再确定USB的使用方案。各芯片内置的USB控制器 如表1-1所示: 表 1‐1 RK平台USB控制器列表 控制器芯 USB2.0 USB USB2.0/3.0 USB2.0 OTG 片 HOST(EHCI&OHCI) HSIC(EHCI) OTG(DWC3/XHCI) (DWC2) RK3399 ×2 ×1 ×2 0 RK3368 ×1 ×1 0 ×1 RK3366 ×1 0 ×1 ×1 RK3328 ×1 0 ×1 ×1 RK3288 0 ×1 0 ×2(host+otg) RK312X ×1 0 0 ×1 RK3188 ×1 ×1 0 ×1 RK30XX ×1 0 0 ×1 1.2 USB2.0 Host Compatible Specification Universal Serial Bus Specification, Revision 2.0 Enhanced Host Controller Interface Specification(EHCI), Revision 1.0 Open Host Controller Interface Specification(OHCI), Revision 1.0a Features Support high-speed(480Mbps), full-speed(12Mbps) andlow-speed(1.5Mbps) 图 1‐1 USB2.0 Host Controller Block Diagram 图 1‐2USB2.0 USB2.0 PHY Block Diagram 1.3 USB2.0 OTG Compatible Specification Universal Serial Bus Specification, Revision 2.0 Features Operates in High-Speed and Full-Speed mode Support 9 channels in host mode 9 Device mode endpoints in addition to control endpoint 0, 4 in, 3 out and 2 IN/OUT Built-in one 1024x35 bits FIFO Internal DMA with scatter/gather function Supports packet-based, dynamic FIFO memory allocation for endpoints for flexible, efficient use of RAM Support dynamic FIFO sizing Support Battery Charge in device role Support Uart Bypass Mode 图 1‐3 USB2.0 OTG Block Diagram 1.4 USB2.0 PHY Host Port: used for USB2.0 host controller OTG Port: used for USB3.0 OTG controller with TypeC PHY to compriseas fully feature TypeC 1.5 USB OTG3.0 Compatible Specification Universal Serial Bus 3.0 Specification, Revision 1.0 Universal Serial Bus Specification, Revision 2.0 eXtensible Host Controller Interface for Universal Serial Bus(xHCI), Revision 1.1 Features DWC3 Features: Support Control/Bulk(including stream)/Interrupt/IsochronousTransfer Simultaneous IN and OUT transfer for USB3.0, up to 8Gbps bandwidth Descriptor Caching and Data Pre-fetching USB3.0 Device Features Up to 7 IN endpoints, including control endpoint 0 Up to 6 OUT endpoints, including control endpoint 0 Up to 13 endpoint transfer resources, each one for each endpoint Flexible endpoint configuration for multiple applications/USBset-configuration modes Hardware handles ERDY and burst Stream-based bulk endpoints with controller automatically initiatingdata movement Isochronous endpoints with isochronous data in data buffers Flexible Descriptor with rich set of features to support bufferinterrupt moderation, multiple transfers, isochronous, control, and scatteredbuffering support USB 3.0 xHCI Host Features: Support up to 64 devices Support 1 interrupter Support 1 USB2.0 port and 1 Super-Speed port Concurrent USB3.0/USB2.0 traffic, up to 8.48Gbps bandwidth Support standard or open-source xHCI and class driver Support xHCI Debug Capability USB 3.0 Dual-Role Device (DRD) Features Static Device operation Static Host operation USB3.0/USB2.0 OTG A device and B device basing on ID UFP/DFP and Data Role Swap Defined in USB TypeC Specification Not support USB3.0/USB2.0 OTG session request protocol(SRP), hostnegotiation protocol(HNP) and Role Swap Protocol(RSP) 图 1‐4 USB3.0 OTG Block Diagram 1.6 TypeC PHY Support USB3.0 (SuperSpeed only) Support DisplayPort 1.3 (RBR, HBR and HBR2 data rates only) Support DisplayPort AUX channel Support USB TypeC and DisplayPort Alt Mode Support DisplayPort Alt Mode on TypeC A, B, C, D, E and F pinassignments Support Normal and Flipped orientation 图 1‐5 TypeC PHY Block Diagram 2 硬件电路及信号 2 硬件电路及信号 2.1 USB HOST控制器硬件电路 USB Host控制器分别包含USB2.0 Host和HSIC,其硬件电路及信号分别说明如下: 2.1.1 USB2.0 HOST控制器硬件电路 USB2.0的工作时钟高达480MHz,所以layout时需要特别注意,USB走线宽度为7-8MIL,做90Ω阻抗差分走线,最 好在表层走线并有包地,边上无干扰源,正对的上下层不能有其他信号走线。 USB HSIC使用240MHz DDR信号,传输速率与USB2.0同为480Mbps,典型的走线阻抗为50Ω,建议最大走线长度 不要超过10cm。 USB2.0HOST控制器硬件信号参考电路如图1-1和图1-2所示,完整的USB 2.0 HOST电路如图2-1 , 图2-3所示: 图 2‐1 USB2.0 HOST SoC信号引脚 图 2‐2 USB2.0 HOST VBUS GPIO控制脚 图 2‐3 HSIC控制器硬件电路 HSIC是具有与USB2.0相同的带宽(480Mbps)的2引脚芯片间互连接口,HSIC去除了为USB2.0设计的模拟收发器 (PHY),供电电压为0.9V和1.2V, 信号传输的标准电压为1.2V,降低了系统的功耗,最大的走线长度为 10cm(4英寸)。 图 2‐4 HSIC硬件电路 2.2 USB OTG控制器硬件电路 2.2.1 USB 2.0 OTG控制器硬件电路 RK3399没有独立的USB2.0 OTG控制器,但有独立的USB3.0 OTG控制器,并且可以向下兼容USB2.0 OTG的完整 功能,而RK3368、RK3366、RK3328、RK3288、RK312X、RK3188、RK30XX有独立的USB2.0 OTG控制器。 完整的 USB 2.0 OTG 参考电路如图2-5 ~ 图2-8所示: 图 2-5 USB 2.0 控制器硬件信号 图 2-6 OTG PORT 电路图 图 2-7 OTG DET 电路图 图 2-8 OTG DRV 电路图 OTG_VBUS:输入信号,用于 USB DEVICE 检测 VBUS 电平, 0:低电平约 0V, 1:高电平约 3V。默认无连接时 电平为低,连接至 PC 或充电器时电平为高。 OTG_ID:输入信号,由 USB OTG 协议定义,用于识别 USB 口所接设备的默认角色(HOST or device)。 USB_ID 默 认上拉,处于 device 状况,如果要控制器进入 HOST 状态,需外接 mini-A 口或 micro-A 口将 USB_ID 短接到地。 OTG_RKELVIN:参考电阻默认 43.2 欧到地,可通过调节该电阻阻值来调整 USB 信号质量。 不同芯片,该参考电 阻的阻值不同, 具体请见相应的 SDK 参考设计原理图。 OTG_DRVVBUS:该信号由 USB OTG 控制器的 HOST 寄存器控制,硬件上通过该信号来控制HOST 所需 5V VBUS 输出。 OTG_DP/OTG_DM:即 Data+, Data-, USB 的两根差分信号线。 2.2.2 USB 3.0 OTG控制器硬件电路 USB3.0 OTG具有USB3.0 OTG功能,且向下兼容USB2.0 OTG功能,最大传输速率为5Gbps,物理接口为Type-C, 支持正反插。在传输线方面,USB3.0支持长达3米的四线差分信号线及11英寸PCB。5Gbps信号在长线缆上采用的 是差分信号方式传输,从而避免信号被干扰及减少电磁干扰问题。 图 2‐5 Type-C 接口定义 图 2‐6 USB3 OTG控制器 SoC信号引脚 图 2‐7 USB3OTG Type-C 接口 图 2‐8 USB3Type-C pd/cc 电路(FUSB302) 图 2‐9 USB3 VBUS控制电路-1(GPIO控制电路输出5V) 图 2‐10 USB3 VBUS控制电路-2(RK818控制电路输出5V) 3 Kernel模块配置 USB模块的配置及保存和其它内核模块的配置方法一样: 导入默认配置: 1 make ARCH=arm64 rockchip_defconfig 选择Kernel配置: 1 make ARCH=arm64 menuconfig 保存default配置: 1 make ARCH=arm64 savedefconfig 保存default配置,然后用defconfig替换rockchip_defconfig。 3.1 USB PHY相关配置 USB PHY模块的配置位于 1 Device Drivers 2 ‐‐‐> PHY Subsystem ‐‐‐> 3 ... 4 <*> Rockchip INNO USB2PHY Driver 5 ... 6 <*> Rockchip TYPEC PHY Driver 7 ... 8 <*> Rockchip INNO USB 3.0 PHY Driver USB2.0 PHY使用的是Innosilicon IP,所以应选择“Rockchip INNO USB2PHY Driver”。 RK3399 RK3366 USB3.0PHY使用的是Type-C,所以应选择“Rockchip TYPEC PHY Driver”。 RK3328 USB3.0PHY 使用的是Innosilicon USB3.0 PHY,所以应选择“Rockchip INNO USB 3.0 PHY Driver”。 3.2 USB HOST相关配置 Makemenuconfig得到Kernel配置界面后,USB模块的配置位于 1 Device Drivers ‐‐‐> 2 ‐*‐ Support for Host‐side USB 3 [*] USB support ‐‐‐> 4 ... 5 <*> xHCI HCD (USB 3.0) support 6 ‐*‐ Generic xHCI driver for a platform device 7 ... 8 <*> EHCI HCD (USB 2.0) support 9 [ ] Root Hub Transaction Translators 10 [*] Improved Transaction Translator scheduling 11 <*> Generic EHCI driver for a platform device 12 ... 13 <*> OHCI HCD (USB 1.1) support 14 < > OHCI support for PCI‐bus USB controllers 15 <*> Generic OHCI driver for a platform device 必须选上USB Support项后才能支持USB模块并进行进一步的配置。 需要支持USB HOST,首先需要选上<*>Supportfor Host-side USB项,然后会现如下的HOST相关的配置,其中, HOST1.1 选择OHCI Driver 配置,HOST2.0 选择EHCI Driver 配置,HOST3.0选择XHCI Driver配置。 3.3 USB OTG相关配置 1 Device Drivers ‐‐‐> 2 ‐*‐ Support for Host‐side USB 3 [*] USB support ‐‐‐> 4 ... 5 <*> DesignWare USB2 DRD Core Support 6 DWC2 Mode Selection (Dual Role mode) 7 ... 8 <*> DesignWare USB3 DRD Core Support 9 DWC3 Mode Selection (Dual Role mode) 3.4 USB Gadget配置 Make menuconfig得到Kernel配置界面后,USB模块的配置位于 1 DeviceDrivers 2 ‐‐‐> [*]USB support 3 ‐‐‐> [*] USB Gadget Support ‐‐‐> 4 ... 5 USBGadget Drivers (USB functions configurable through configfs) RK3399目前支持MTP、PTP、Accessory、ADB、MIDI、Audio等Gadget功能。 3.5 USB其它模块配置 3.5.1 Mass Storage Class(MSC) U盘属于SCSI设备,所以在配置USB模块之前需要配置SCSI选项(默认配置已经选上)。 1 Device Drivers 2 ‐‐‐> SCSI device support ‐‐‐> 3 ... 4 <*> SCSI disk support 5 ... SCSI 其他相关配置: 1 2 Device Drivers ‐‐‐> SCSI device support ‐‐‐> 3 <*> SCSI device support 4 [ ] SCSI: use blk‐mq I/O path by default 5 [*] legacy /proc/scsi/ support 6 *** SCSI support type (disk, tape, CD‐ROM) *** 7 <*> SCSI disk support 8 < > SCSI tape support 9 < > SCSI OnStream SC‐x0 tape support 10 < > SCSI CDROM support <*> SCSI generic support ‐‐‐> 11 <*> SCSI generic support 12 <*> SCSI media changer support 13 [*] Verbose SCSI error reporting (kernel size +=75K) 14 [*] SCSI logging facility 15 [*] Asynchronous SCSI scanning 16 SCSI Transports ‐‐‐> 17 [*] SCSI low‐level drivers 18 [ ] PCMCIA SCSI adapter support ‐‐‐> 19 [ ] SCSI Device Handlers ‐‐‐‐ ‐‐‐‐ 配置完SCSI Device Support后,可以在USB Support中找到如下选项,选上即可。 1 2 3 Device Driver ‐‐‐> [*] USB support ‐‐‐> <*> USB Mass Storage support 3.5.2 USB Serial Converter 支持USB 3G Modem USB 3G Modem使用的是USB转串口,使用时需要选上如下选项: 1 2 Device Driver ‐‐‐> [*] USB support ‐‐‐> 3 ... 4 [*] USB driver for GSM and CDMA modems 5 ... 6 <*> USB Serial Converter support 7 ‐‐‐> <*> USB Prolific 2303 Single Port Serial Driver 支持PL2303 如果要使用PL2303输出数据到串口,需要选择如下选项: 1 2 Device Driver ‐‐‐> [*] USB support ‐‐‐> 3 ... 4 <*> USB Serial Converter support 5 ‐‐‐> <*> USB Prolific 2303 Single Port Serial Driver 支持USB GPS 如果要支持USB GPS,如u-blox 6 - GPS Receiver设备,需要选择如下选项: 1 2 3 Device Drivers ‐‐‐> [*] USB support ‐‐‐> [*] USB Modem (CDC ACM) support 3.5.3 USB HID USB键鼠的配置选项如下: 1 Device Drivers 2 ‐‐‐> [*] HID support 3 [*] USB HID transport layer 4 [ ] PID device support 5 [*] /dev/hiddev raw HID device support 3.5.4 USB Net USB Bluetooth 1 [*] Networking support ‐‐‐> 2 ... 3 <*> Bluetooth subsystem support 4 Bluetooth device drivers ‐‐‐> ‐‐‐> 5 ... 6 <*> HCI USB driver 7 [*] Broadcom protocol support (NEW) 8 [*] Realtek protocol support (NEW) 9 ... USB Wifi 通常直接使用Vendor提供的驱动和配置。 USB Ethernet 1 2 3 Device Driver ‐‐‐> [*] Network device support ‐‐‐> <*> USB Network Adapters ‐‐‐> 4 <*> USB CATC NetMate‐based Ethernet device support 5 <*> USB KLSI KL5USB101‐based ethernet device support 6 <*> USB Pegasus/Pegasus‐II based ethernet device support 7 <*> USB RTL8150 based ethernet device support 8 <*> Realtek RTL8152/RTL8153 Based USB Ethernet Adapters 9 < > Microchip LAN78XX Based USB Ethernet Adapters 10 <*> Multi‐purpose USB Networking Framework 11 <*> ASIX AX88xxx Based USB 2.0 Ethernet Adapters 12 <*> ASIX AX88179/178A USB 3.0/2.0 to Gigabit Ethernet 13 ‐*‐ CDC Ethernet support (smart devices such as cable modems) 14 <*> CDC EEM support 15 ‐*‐ CDC NCM support 16 < > Huawei NCM embedded AT channel support 17 <*> CDC MBIM support 18 <*> Davicom DM96xx based USB 10/100 ethernet devices 19 < > CoreChip‐sz SR9700 based USB 1.1 10/100 ethernet devices 20 < > CoreChip‐sz SR9800 based USB 2.0 10/100 ethernet devices 21 <*> SMSC LAN75XX based USB 2.0 gigabit ethernet devices 22 <*> SMSC LAN95XX based USB 2.0 10/100 ethernet devices 23 <*> GeneSys GL620USB‐A based cables 24 <*> NetChip 1080 based cables (Laplink, ...) 25 <*> Prolific PL‐2301/2302/25A1/27A1 based cables 26 <*> MosChip MCS7830 based Ethernet adapters <*> Host for RNDIS and ActiveSync devices 27 <*> Host for RNDIS and ActiveSync devices 28 <*> Simple USB Network Links (CDC Ethernet subset) 29 [*] ALi M5632 based 'USB 2.0 Data Link' cables 30 [*] AnchorChips 2720 based cables (Xircom PGUNET, ...) 31 [*] eTEK based host‐to‐host cables (Advance, Belkin, ...) 32 [*] Embedded ARM Linux links (iPaq, ...) 33 [*] Epson 2888 based firmware (DEVELOPMENT) 34 [*] KT Technology KC2190 based cables (InstaNet) 35 <*> Sharp Zaurus (stock ROMs) and compatible 36 <*> Conexant CX82310 USB ethernet port 37 <*> Samsung Kalmia based LTE USB modem 38 <*> QMI WWAN driver for Qualcomm MSM based 3G and LTE modems 39 <*> Option USB High Speed Mobile Devices 40 <*> Intellon PLC based usb adapter 41 <*> Apple iPhone USB Ethernet driver 42 <*> USB‐to‐WWAN Driver for Sierra Wireless modems 43 < > LG VL600 modem dongle 44 < > QingHeng CH9200 USB ethernet support 3.5.5 USB Camera 1 2 3 Device Driver ‐‐‐> <*> Multimedia support [*] ‐‐‐> Media USB Adapters ‐‐‐> 4 *** Webcam devices *** 5 <*> USB Video Class (UVC) 6 [*] UVC input events device support 3.5.6 USBAudio 1 2 3 Device Driver ‐‐‐> <*> Sound card support ‐‐‐> <*> Advanced Linux Sound Architecture ‐‐‐> 4 ... 5 [*] USB sound devices 6 ‐‐‐> [*] USB Audio /MIDI driver 3.5.7 USBHUB 如果要支持USB HUB,请将“Disable external HUBs”配置选项去掉。 1 2 Device Drivers ‐‐‐> [*] USB support ‐‐‐> 3 ‐*‐ Support for Host‐side USB 4 ... 5 [*] Disable external hubs 3.5.8 其他USB设备配置 其他有可能用到的USB设备还有很多,如GPS,Printer等,有可能需要Vendor定制的驱动,也有可能是标准的 Class驱动,如需支持,可直接在网络上搜索Linux对该设备支持要做的工作,RK平台并无特殊要求,可直接参考。 4 Device Tree开发 ARM Linux内核在Linux-3.x内核取消了传统的设备文件而用设备树(DT)取代,因此,现在内核有关硬件描述的 信息都需要放入DT中配置,下面对涉及到USB模块的DT开发做以详细说明。 4.1 USB PHY DTS USB2.0 PHY的配置主要包括PHY的时钟、中断配置和VBUS Supply的配置。 USB3.0 PHY的配置主要包括PHY的时钟、中断配置、Reset和Type-CPHY状态寄存器地址。 4.1.1 USB2.0 PHY DTS USB2.0 PHY详细配置可参考内核Documentation/devicetree/bindings/phy目录文档说明。 Innosilicon PHY对应的文档为: Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt 具体分为DTSI和DTS两部分配置,下面以RK3399上一个Host Port的PHY为例说明。 下面所示为DTSI的配置,DTSI主要配置PHY的公有属性。 1 grf: syscon@ff770000 { 2 compatible = "rockchip,rk3399‐grf", "syscon", "simple‐mfd"; 3 reg = <0x0 0xff770000 0x0 0x10000>; 4 #address‐cells = <1>; 5 #size‐cells = <1>; 6 7 u2phy0: usb2‐phy@e450 { 8 compatible = "rockchip,rk3399‐usb2phy"; 9 reg = <0xe450 0x10>; 10 clocks = <&cru SCLK_USB2PHY0_REF>; 11 clock‐names = "phyclk"; 12 #clock‐cells = <0>; 13 clock‐output‐names = "clk_usbphy0_480m"; 14 status = "disabled"; 15 16 u2phy0_host: host‐port { 17 #phy‐cells = <0>; 18 interrupts =; 19 interrupt‐names = "linestate"; 20 status = "disabled"; 21 22 }; }; 首先,USB PHY Driver中都是在操作GRF,所以USB PHY的节点必须作为GRF的一个子节点。 其次,USB PHY节点中包括USB PHY的硬件属性和PHY port的硬件属性,其中PHY的属性为所有port的共有属性, 比如Input时钟;port属性主要包括各个port所拥有的中断,比如Linestate中断、otg-id中断,otg-bvalid等。 最后,需要注意的是port的名称,HOST对应的port要求命名为“host-port”,OTG对应的命名为“otg-port”,因为 Driver中根据这两个名称做不同port的初始化。下面所示为DTS的配置。 1 u2phy0_host: host‐port { 2 phy‐supply = <&vcc5v0_host>; 3 status = "okay"; 4 }; DTS的配置,主要根据不同的产品形态,配置PHY的私有属性。目前SDK-DTS的配置,主要包括phy-port的Enable 以及phy-Supply即Vbus Supply的配置。 vbus supply的配置有两种方式,一种是配置成GPIO形式,直接在驱动中控制GPIO,进而控制的供给;另外一种 是目前内核比较通用的Regulator配置。 下面以Host Vbus的配置,详细讲述regulator的配置方法。其主要分为Regulator及pinctrl两个节点的配置。 1 vcc5v0_host: vcc5v0‐host‐regulator { 2 compatible = "regulator‐fixed"; 3 enable‐active‐high; 4 gpio = <&gpio4 25 GPIO_ACTIVE_HIGH>; 5 pinctrl‐names = "default"; 6 pinctrl‐0 = <&host_vbus_drv>; 7 regulator‐name = "vcc5v0_host"; 8 regulator‐always‐on; 9 }; 如上面所示,这是一个vbus-host-regulator的配置实例,“enable-active-high”属性标识GPIO拉高使能;“pinctrl-0 = <&host_vbus_drv>;”Property代表这个regulator所引用的Pinctrl中节点的名称,具体regulator的配置可参考 LinuxKernel相关regulator的文档。通过对于USB模块而言,vbus-regulator应该在DTS中(而不是DTSI中)做配 置。 1 usb2 { 2 host_vbus_drv: host‐vbus‐drv { 3 rockchip,pins = 4 <4 25 RK_FUNC_GPIO &pcfg_pull_none>; 5 }; 6 }; 如上面所示,这是hostvbus-drv的pinctrl属性,rockchip,pins属性即GPIO信息,需要从硬件原理图获知。这个节 点作为Pinctrl的子节点,通过在DTSI(而不是DTS中)做配置。 4.1.2 USB3.0 PHY DTS USB3.0 PHY为Type-C PHY,详细的配置说明请查看: Documentation/devicetree/bindings/phy/phy-rockchip-typec.txt Example: 1 tcphy0: phy@ff7c0000 { 2 compatible = "rockchip,rk3399‐typec‐phy"; 3 reg = <0x0 0xff7c0000 0x0 0x40000>; 4 rockchip,grf = <&grf>; 5 #phy‐cells = <1>; 6 clocks = <&cru SCLK_UPHY0_TCPDCORE>, <&cru SCLK_UPHY0_TCPDPHY_REF>; 7 <&cru SCLK_UPHY0_TCPDPHY_REF>; 8 clock‐names = "tcpdcore", "tcpdphy‐ref"; 9 assigned‐clocks = <&cru SCLK_UPHY0_TCPDCORE>; 10 assigned‐clock‐rates = <50000000>; 11 power‐domains = <&power RK3399_PD_TCPD0>; 12 resets = <&cru SRST_UPHY0>, 13 <&cru SRST_UPHY0_PIPE_L00>, 14 <&cru SRST_P_UPHY0_TCPHY>; 15 reset‐names = "uphy", "uphy‐pipe", "uphy‐tcphy"; 16 rockchip,typec‐conn‐dir = <0xe580 0 16>; 17 rockchip,usb3tousb2‐en = <0xe580 3 19>; 18 rockchip,usb3‐host‐disable = <0x2434 0 16>; 19 rockchip,usb3‐host‐port = <0x2434 12 28>; 20 rockchip,external‐psm = <0xe588 14 30>; 21 rockchip,pipe‐status = <0xe5c0 0 0>; 22 rockchip,uphy‐dp‐sel = <0x6268 19 19>; 23 status = "disabled"; 24 25 tcphy0_dp: dp‐port { 26 #phy‐cells = <0>; 27 }; 28 29 tcphy0_usb3: usb3‐port { 30 #phy‐cells = <0>; 31 32 }; }; 4.2 USB2.0 Controller DTS USB2.0控制器主要包括EHCI、OHCI、OTG。其中EHCI和OHCI Rockchip采用Linux 内核Generic驱动,一般开发 时只需要对DT作相应配置,即可正常工作。 4.2.1 USB2.0 HOST Controller DTS 下面所示为一个EHCI控制器的典型配置,主要包括register、interrupts、clocks的配置。需要注意,EHCI相关的 时钟,通常需要配置EHCI控制器和EHCI/OHCI仲裁器两个时钟。此外,phys直接配置对应phy-port的名称即可。 1 usb_host0_ehci: usb@fe380000 { 2 compatible = "generic‐ehci"; 3 reg = <0x0 0xfe380000 0x0 0x20000>; 4 interrupts = ; 5 clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST0_ARB>, 6 <&cru SCLK_USBPHY0_480M_SRC>; 7 clock‐names = "hclk_host0", "hclk_host0_arb", "usbphy0_480m"; 8 phys = <&u2phy0_host>; 9 phy‐names = "usb"; 10 power‐domains = <&power RK3399_PD_PERIHP>; 11 status = "disabled"; 12 }; 下面所示为一个OHCI控制器的配置,其内容基本跟EHCI相同。 1 usb_host0_ohci: usb@fe3a0000 { 2 compatible = "generic‐ohci"; 3 reg = <0x0 0xfe3a0000 0x0 0x20000>; 4 interrupts = ; 5 clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST0_ARB>, 6 <&cru SCLK_USBPHY0_480M_SRC>; 7 clock‐names = "hclk_host0", "hclk_host0_arb", "usbphy0_480m"; 8 phys = <&u2phy0_host>; 9 phy‐names = "usb"; 10 power‐domains = <&power RK3399_PD_PERIHP>; 11 status = "disabled"; 12 }; 4.2.2 USB2.0 otg Controller DTS 如下所示,为一个DWC2控制器的典型配置,主要包括register、interrupts、clocks的配置。需要注意,DWC2相 关的时钟,通常需要配置HCLK和PMUCLK两个时钟。此外,phys直接配置对应phy-port的名称即可。 详细的配置说明请查看: Documentation/devicetree/bindings/usb/dwc2.txt 1 usb20_otg: usb@ff580000 { 2 compatible = "rockchip,rk3328‐usb", "rockchip,rk3066‐usb", 3 "snps,dwc2"; 4 reg = <0x0 0xff580000 0x0 0x40000>; 5 interrupts = ; 6 clocks = <&cru HCLK_OTG>, <&cru HCLK_OTG_PMU>; 7 clock‐names = "otg", "otg_pmu"; 8 dr_mode = "otg"; 9 g‐np‐tx‐fifo‐size = <16>; 10 g‐rx‐fifo‐size = <275>; 11 g‐tx‐fifo‐size = <256 128 128 64 64 32>; 12 g‐use‐dma; 13 phys = <&u2phy_otg>; 14 phy‐names = "usb2‐phy"; 15 status = "disabled"; 16 }; 4.3 USB3.0 Controller DTS 4.3.1 USB3.0 HOST Controller DTS USB3.0 HOST控制器为XHCI,集成于DWC3 OTG IP中,所以不用单独配置dts,只需要配置DWC3,并且设置 DWC3的dr_mode属性为dr_mode = "otg"或者dr_mode = "host",即可以enable XHCI控制器。 4.3.2 USB3.0 OTG Controller DTS USB3.0 OTG的详细配置方法,请查看: Documentation/devicetree/bindings/usb/dwc3-rockchip.txt Example: 1 usbdrd3: usb@ff600000 { 2 compatible = "rockchip,rk3328‐dwc3"; 3 clocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>, 4 <&cru ACLK_USB3OTG>; 5 clock‐names = "ref_clk", "suspend_clk", 6 "bus_clk"; 7 #address‐cells = <2>; 8 #size‐cells = <2>; 9 ranges; 10 status = "disabled"; 11 12 usbdrd_dwc3: dwc3@ff600000 { 13 compatible = "snps,dwc3"; 14 reg = <0x0 0xff600000 0x0 0x100000>; 15 interrupts = ; 16 dr_mode = "host"; 17 phys = <&u3phy_utmi>, <&u3phy_pipe>; 18 phy‐names = "usb2‐phy", "usb3‐phy"; 19 phy_type = "utmi_wide"; 20 snps,dis_enblslpm_quirk; 21 snps,dis‐u2‐freeclk‐exists‐quirk; 22 snps,dis_u2_susphy_quirk; 23 snps,dis‐u3‐autosuspend‐quirk; 24 snps,dis_u3_susphy_quirk; 25 snps,dis‐del‐phy‐power‐chg‐quirk; 26 snps,tx‐ipgap‐linecheck‐dis‐quirk; 27 status = "disabled"; 28 29 }; }; 5 驱动开发 目前,EHCI、OHCI、DWC3均采用Linux Upstream的代码,因此驱动本身修改的可能性很少,只需要对DT做正确 配置即可;DWC2使用内部版和Upstream 版两个版本,内部版使用的时间较久,稳定性相对较好,Upstream版 主要和Upstream同步更新;USB2.0PHY的驱动也已经upstream,后续开发仅需对芯片做适配即可。 5.1 USB PHY drivers 5.1.1 USB2.0 PHY driver Driver代码路径: drivers/phy/phy-rockchip-inno-usb2.c USB2.0PHY采用Innosilicon IP,SoC上有两个USB2.0的PHY,每个PHY有两个port,一个port用于支持USB2.0 HOST控制器,另一个port用于支持USB2.0 OTG控制器。 对于Innosilicon IP USB2.0 PHY特性,目前已开发并upstream了相应的PHY驱动代码,针对host-port,主要涉及 到suspend/resume、sm_work相关的配置;具体register说明可参考代码(drivers/phy/phy-rockchip-innousb2.c)中注释。 NOTE:请参照代码阅读以下内容。 对于新功能的开发,首先应清楚该功能是针对phy还是phy-port,然后对应操作struct rockchip_usb2phy和struct rockchip_usb2phy_port两个数据结构,第一个用于管理phy的成员属性;第二个用于管理phy-port的成员属性。 同时,配合上面两个数据结构,还有struct rockchip_usb2phy_cfg 和struct rockchip_usb2phy_port_cfg两个用于 配置的数据结构。如下是一个典型的USB2.0 host port的配置。 1 2 static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = { { 3 .reg = 0xe450, 4 .num_ports = 2, 5 .phy_tuning = rk3399_usb2phy_tuning, 6 .clkout_ctl = { 0xe450, 4, 4, 1, 0 }, 7 .port_cfgs 8 = { [USB2PHY_PORT_HOST] = { 9 .phy_sus = { 0xe458, 1, 0, 0x2, 0x1 }, 10 .ls_det_en = { 0xe3c0, 6, 6, 0, 1 }, 11 .ls_det_st = { 0xe3e0, 6, 6, 0, 1 }, 12 .ls_det_clr = { 0xe3d0, 6, 6, 0, 1 }, 13 .utmi_ls 14 .utmi_hstdet 15 = { 0xe2ac, 22, 21, 0, 1 }, = { 0xe2ac, 23, 23, 0, 1 } } 16 }, 下面是USB2.0 otg-port phy配置参考,port_cfgs主要用于插拔和otg mode 检测,chg_det主要用于充电类型检 测: 1 2 static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = { { 3 .reg = 0xe450, 4 .num_ports = 2, 5 .phy_tuning = rk3399_usb2phy_tuning, 6 .clkout_ctl = { 0xe450, 4, 4, 1, 0 }, 7 .port_cfgs 8 9 = { [USB2PHY_PORT_OTG] = { .phy_sus = { 0xe454, 8, 0, 0x052, 0x1d1 }, 10 .bvalid_det_en = { 0xe3c0, 3, 3, 0, 1 }, 11 .bvalid_det_st = { 0xe3e0, 3, 3, 0, 1 }, 12 .bvalid_det_clr = { 0xe3d0, 3, 3, 0, 1 }, 13 .bypass_dm_en 14 .bypass_sel = { 0xe450, 3, 3, 0, 1 }, 15 .idfall_det_en = { 0xe3c0, 5, 5, 0, 1 }, 16 .idfall_det_st = { 0xe3e0, 5, 5, 0, 1 }, 17 .idfall_det_clr = { 0xe3d0, 5, 5, 0, 1 }, 18 .idrise_det_en = { 0xe3c0, 4, 4, 0, 1 }, 19 .idrise_det_st = { 0xe3e0, 4, 4, 0, 1 }, 20 .idrise_det_clr = { 0xe3d0, 4, 4, 0, 1 }, 21 .ls_det_en = { 0xe3c0, 2, 2, 0, 1 }, 22 .ls_det_st = { 0xe3e0, 2, 2, 0, 1 }, 23 .ls_det_clr = { 0xe3d0, 2, 2, 0, 1 }, 24 .utmi_avalid = { 0xe2ac, 7, 7, 0, 1 }, 25 .utmi_bvalid = { 0xe2ac, 12, 12, 0, 1 }, 26 .utmi_iddig = { 0xe2ac, 8, 8, 0, 1 }, .utmi_ls = { 0xe450, 2, 2, 0, 1 }, = { 0xe2ac, 14, 13, 0, 1 }, 27 .utmi_ls 28 .vbus_det_en 29 = { 0xe2ac, 14, 13, 0, 1 }, = { 0x449c, 15, 15, 1, 0 }, }, 30 }, 31 .chg_det = { 32 .opmode 33 .cp_det = { 0xe2ac, 2, 2, 0, 1 }, 34 .dcp_det = { 0xe2ac, 1, 1, 0, 1 }, 35 .dp_det = { 0xe2ac, 0, 0, 0, 1 }, 36 .idm_sink_en = { 0xe450, 8, 8, 0, 1 }, 37 .idp_sink_en = { 0xe450, 7, 7, 0, 1 }, 38 .idp_src_en = { 0xe450, 9, 9, 0, 1 }, 39 .rdm_pdwn_en 40 .vdm_src_en = { 0xe450, 12, 12, 0, 1 }, 41 = { 0xe454, 3, 0, 5, 1 }, = { 0xe450, 10, 10, 0, 1 }, .vdp_src_en = { 0xe450, 11, 11, 0, 1 }, 42 }, 43 }, 5.1.2 USB3.0 PHY driver Driver代码有两个版本,3228H、3328的USB3.0 PHY使用Innosilicon IP。 代码路径: drivers/phy/rockchip/phy-rockchip-inno-usb3.c Innosilicon IP 只包含一个USB3.0 PHY 端口,支持USB3.0 底层数据传输、LFPS通信和物理信号检测等功能。 对于Innosilicon IP USB3.0 PHY特性,目前已开发了相应的PHY驱动代码,暂时还未upstream,对端口的控制, 主要涉及suspend/resume、power和detective等,具体register说明可参考代码(drivers/phy/phy-rockchipinno-usb3.c)中注释。 NOTE:请参照代码阅读以下内容。 对于新功能的开发,主要操作struct rockchip_u3phy和struct rockchip_u3phy_port两个数据结构,第一个用于管 理phy的成员属性;第二个用于管理phy-port的成员属性。 同时,配合上面两个数据结构,还有struct rockchip_u3phy_cfg 、struct rockchip_u3phy_grf_cfg和 struct rockchip_u3phy_apbcfg三个用于配置的数据结构。struct rockchip_u3phy_apbcfg主要用于保存USB物理信号 tuning的相关参数,在tuning 函数中直接赋值给相关寄存器;struct rockchip_u3phy_cfg和struct rockchip_u2phy_grf_cfg则是用于USB底层协议相关的功能性相关属性配置,如下是一个典型的 rockchip_u3phy_cfg的配置。 1 2 static const struct rockchip_u3phy_cfg rk3328_u3phy_cfgs[] = { { 3 .reg = 0xff470000, 4 .grfcfg = { 5 .um_suspend = { 0x0004, 15, 0, 0x1452, 0x15d1 }, 6 .u2_only_ctrl 7 .um_ls = { 0x0030, 5, 4, 0, 1 }, 8 .um_hstdct = { 0x0030, 7, 7, 0, 1 }, 9 .ls_det_en = { 0x0040, 0, 0, 0, 1 }, 10 .ls_det_st = { 0x0044, 0, 0, 0, 1 }, 11 .pp_pwr_st = { 0x0034, 14, 13, 0, 0}, .pp_pwr_en = { {0x0020, 14, 0, 0x0014, 0x0005}, = { 0x0020, 15, 15, 0, 1 }, 12 .pp_pwr_en = { {0x0020, 14, 0, 0x0014, 0x0005}, 13 {0x0020, 14, 0, 0x0014, 0x000d}, 14 {0x0020, 14, 0, 0x0014, 0x0015}, 15 {0x0020, 14, 0, 0x0014, 0x001d} }, 16 .u3_disable = { 0x04c4, 15, 0, 0x1100, 0x101}, 17 }, 18 .phy_pipe_power = rk3328_u3phy_pipe_power, 19 .phy_tuning = rk3328_u3phy_tuning, 20 .phy_cp_test 21 22 23 = rk322xh_u3phy_cp_test_enable, }, { /* sentinel */ } }; 其余芯片的USB3.0 PHY 为Cadence IP, 代码路径: drivers/phy/rockchip/phy-rockchip-typec.c Cadence IP 只有一个端口,支持USB3.1、DisplayPort1.3,可以工作在USB、DisplayPort、USB+DisplayPort三 种模式,DisplayPort部分在显示部分的文档描述,这里我们只关心USB部分,Cadence IP同样支持USB3.0 底层数 据传输、LFPS通信和物理信号检测等功能。 对于Cadence IP USB3.0 PHY特性,目前已开发并upstream了相应的PHY驱动代码,针对端口的控制,主要涉及 到suspend/resume、power、DP USB模式切换等,具体register说明可参考代码(drivers/phy/rockchip/phyrockchip-inno-usb3.c)中注释。 对于新功能的开发,主要操作struct rockchip_typec和stuct rockchip_usb3phy_port_cfg 两个数据结构,第一个用 于管理phy的成员属性;第二个用于管理phy-port的成员属性。rockchip_usb3phy_port_cfg的配置参数在驱动初 始化时通过DTS传入,运行过程中通过调用tcphy_get_mode获取实际连接状态进行实时配置。 除此之外驱动中新建了struct phy_reg usb3_pll_cfg用于保存PLL相关的寄存器配置,常见的配置参数如下: 1 struct phy_reg usb3_pll_cfg[] = { 2 { 0xf0, CMN_PLL0_VCOCAL_INIT }, 3 { 0x18, CMN_PLL0_VCOCAL_ITER }, 4 { 0xd0, CMN_PLL0_INTDIV }, 5 { 0x4a4a, CMN_PLL0_FRACDIV }, 6 { 0x34, CMN_PLL0_HIGH_THR }, 7 { 0x1ee, CMN_PLL0_SS_CTRL1 }, 8 { 0x7f03, CMN_PLL0_SS_CTRL2 }, 9 { 0x20, CMN_PLL0_DSM_DIAG }, 10 { 0, CMN_DIAG_PLL0_OVRD }, 11 { 0, CMN_DIAG_PLL0_FBH_OVRD }, 12 { 0, CMN_DIAG_PLL0_FBL_OVRD }, 13 { 0x7, CMN_DIAG_PLL0_V2I_TUNE }, 14 { 0x45, CMN_DIAG_PLL0_CP_TUNE }, { 0x8, CMN_DIAG_PLL0_LF_PROG }, 15 16 }; 5.2 USB Controller drivers 5.2.1 USB3.0 OTG drivers Driver代码路径: drivers/usb/dwc3/* drivers/usb/host/xhci* 目前USB3.0 OTG使用Synopsys 方案,即XHCI扩展的DWC3控制器,Host功能在XHCI框架下实现,而Device功能 由DWC3扩展部分实现。 USB3.0 OTG控制器核心驱动使用Upstream版 IP厂商开源代码,包括XHCI和DWC3两个部分,目前已经完善核心 驱动,开发并upstream了核心驱动的引导代码,主要实现引导XHCI+DWC3_Gadget控制器初始化,OTG各种模式 之间的切换、runtime suspend 相关的初始化等功能。具体实现可查看引导代码drivers/usb/dwc3/dwc3rockchip.c 。 dwc3-rockchip在sys/kernel/debug/目录下建了几个节点,用于调试和配置: 1 rk3399_box:/sys/kernel/debug/usb@fe800000 # ls 2 host_testmode rk_usb_force_mode 接口功能: host_testmode: Enables USB2/USB3 HOST Test Modes (U2: J, K SE0 NAK, Test_packet,Force Enable; U3: Compliance mode) For example, set testmodes for RK3399 board USB: 1. set Test packet for Type-C0 USB2 HOST: 1 echo test_packet > /sys/kernel/debug/usb@fe800000/host_testmode 2. set compliance mode for Type-C0 USB3 HOST normal orientation: 1 echo test_u3 > /sys/kernel/debug/usb@fe800000/host_testmode 3. set compliance mode for Type-C0 USB3 HOST flip orientation: 1 echo test_flip_u3 > /sys/kernel/debug/usb@fe800000/host_testmode 4. check the testmode status: 1 cat /sys/kernel/debug/usb@fe800000/host_testmode The log maybe like this: U2: test_packet /* means that U2 in test mode */ U3: compliance mode /* means that U3 in test mode */ rk_usb_force_mode: force dr_mode of DWC3 controller (the dr_mode of DTS must be "otg" and extcon of DTS must be config to null. For example, set force mode for RK3399 board USB: 1. Force host mode: 1 echo host > sys/kernel/debug/usb@fe800000/rk_usb_force_mode 2. Force peripheral mode: 1 echo peripheral > sys/kernel/debug/usb@fe800000/rk_usb_force_mode 3. Force otg mode: 1 echo otg > sys/kernel/debug/usb@fe800000/rk_usb_force_mode drivers/usb/dwc3 目录下的文件主要包括厂商引导驱动,Host Device通用DWC3控制器驱动和Device驱动,其中 文件名带厂商名字的为产商引导驱动,RK驱动文件名为dwc3-rockchip.c,core.c是DWC3控制器核心驱动,负责 加载XHCI驱动初始化XHCI控制器、加载Device驱动和初始化DWC3 Device控制器,gadget.c是DWC3 Device驱动 文件,主要实现控制器相关的Device初始化、中断处理和数据传输等功能。 重要的接口实现函数: 1 static const struct usb_gadget_ops dwc3_gadget_ops = { 2 .get_frame = dwc3_gadget_get_frame, 3 .wakeup = dwc3_gadget_wakeup, 4 .set_selfpowered 5 .pullup = dwc3_gadget_pullup, 6 .udc_start = dwc3_gadget_start, 7 .udc_stop = dwc3_gadget_stop, 8 = dwc3_gadget_set_selfpowered, }; DWC3 在sys/kernel/debug目录下增加了几个调试接口,主要针对device,debug接口如下: 1 rk3399_box:/sys/kernel/debug/fe800000.dwc3 # ls 2 ep0in 3 ep0out ep1out ep2out ep3out ep4out ep5out link_state regdump ep1in ep2in ep3in ep4in ep5in ep6in mode 4 5 rk3399_box:/sys/kernel/debug/fe800000.dwc3/ep0in # ls 6 descriptor_fetch_queue rx_info_queue 7 event_queue rx_request_queue tx_fifo_queue 8 rx_fifo_queue transfer_type trb_ring tx_request_queue 接口功能: ep*in/out: Directory of EP debug files mode: dr_mode read or store link_state: Link state read or store regdump: Dump registers of DWC3 descriptor_fetch_queue: Dump the available DescFetchQ space of EP rx_info_queue: Dump the available RXInfoQ space of EP trb_ring: Dump the TRB pool of EP event_queue: Dump the avaliable EventQ space of EP rx_request_queue: Dump the avaliable RxReqQ space of EP tx_fifo_queue: Dump the avaliable TxFIFO space of EP testmode rx_fifo_queue: Dump the avaliable RxFIFO space of EP transfer_type: Print the Transfer Type of EP tx_request_queue: Dump the abaliable TxReqQ space of EP drivers/usb/host目录下文件名含有“xhci“的为XHCI控制器相关驱动,其中xhci-plat.c是注册驱动的初始化文件, xhci.c是控制器基础文件,实现USB core层HCD接口和USB传输控制的相关操作,xhci-ring.c是控制器数据结构 TRB以及传输机制相关的文件,实现具体的传输功能,xhci-hub.c是控制器自带的USB3.0 root Hub驱动。 重要的接口实现函数: 1 static const struct hc_driver xhci_hc_driver = { 2 .description = "xhci‐hcd", 3 .product_desc = "xHCI Host Controller", 4 .hcd_priv_size = sizeof(struct xhci_hcd *), 5 /* 6 7 * generic hardware linkage */ 8 .irq = xhci_irq, 9 .flags = HCD_MEMORY | HCD_USB3 | HCD_SHARED, 10 11 12 /* * basic lifecycle operations */ 13 .reset = NULL, /* set in xhci_init_driver() */ 14 .start = xhci_run, 15 .stop = xhci_stop, 16 .shutdown = xhci_shutdown, 17 /* 18 * managing i/o requests and associated device resources 19 */ 20 .urb_enqueue = xhci_urb_enqueue, 21 .urb_dequeue = xhci_urb_dequeue, 22 .alloc_dev = xhci_alloc_dev, 23 .free_dev = 24 .alloc_streams = xhci_alloc_streams, 25 .free_streams = xhci_free_streams, 26 .add_endpoint = xhci_add_endpoint, 27 .drop_endpoint = xhci_drop_endpoint, 28 .endpoint_reset = xhci_endpoint_reset, 29 .check_bandwidth = xhci_check_bandwidth, 30 .reset_bandwidth = xhci_reset_bandwidth, 31 .address_device = xhci_address_device, 32 .enable_device = xhci_enable_device, 33 .update_hub_device = 34 .reset_device = 35 /* 36 37 xhci_free_dev, xhci_update_hub_device, xhci_discover_or_reset_device, * scheduling support */ 38 .get_frame_number = xhci_get_frame, 39 /* 40 * root hub support 41 */ 42 .hub_control = xhci_hub_control, .hub_status_data = xhci_hub_status_data, 43 .hub_status_data = xhci_hub_status_data, 44 .bus_suspend = xhci_bus_suspend, 45 .bus_resume = xhci_bus_resume, 46 /* 47 * call back when device connected and addressed 48 */ 49 .update_device = 50 .set_usb2_hw_lpm = 51 .enable_usb3_lpm_timeout = 52 .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, 53 54 xhci_update_device, xhci_set_usb2_hardware_lpm, xhci_enable_usb3_lpm_timeout, .find_raw_port_number = xhci_find_raw_port_number, }; XHCI驱动没有文件系统下的debug接口,但是可以通过在内核编译的config文件中增加 CONFIG_DYNAMIC_DEBUG,打开debug信息。 5.2.2 USB2.0 OTG drivers Driver 代码路径: upstream 版:drivers/usb/dwc2/* 内部版:drivers/usb/dwc_otg_310/* USB2.0 OTG使用的是Synopsys 方案,即使用DWC2控制器同时实现Host和Device功能,DWC2控制器通过检测 OTG口上ID脚的电平判断切换为何种模式,ID脚的电平变化触发控制器ID脚中断,然后由软件切换到对应模式。 目前使用两种驱动版本,一个是upstream 版,驱动在dwc2目录下,主要从upstream开源项目更新代码,另一个 是内部版,驱动在dwc_otg_310目录下,由RK内部自行维护,还未upstream。 DWC2驱动没有切换dr_mode的节点,但是RK的USB2.0 PHY驱动在sys/devices/platform/下建立了一个 otg_mode节点用于切换: 1 rk3399_box:/sys/devices/platform/ff770000.syscon/ff770000.syscon:usb2‐phy@e450 # ls 2 driver driver_override modalias of_node otg_mode phy power subsystem uevent 接口功能: otg_mode: Show & store the current value of otg mode for otg port For example, set force mode for RK3399 board USB: 1. Force host mode 1 echo host > /sys/devices/platform/ /otg_mode 2. Force peripheral mode 1 echo peripheral > /sys/devices/platform/ /otg_mode 3. Force otg mode 1 echo otg > /sys/devices/platform/ /otg_mode Legacy Usage: 1. Force host mode 1 echo 1 > /sys/devices/platform/ /otg_mode 2. Force peripheral mode 1 echo 2 > /sys/devices/platform/ /otg_mode 3. Force otg mode 1 echo 0 > /sys/devices/platform/ /otg_mode drivers/usb/dwc2目录下的文件可以分成三类,一类是文件名包含“hcd”的Host相关驱动,负责Host初始化、Host 中断处理和Host数据传输操作,一类是Device相关文件gadget.c,负责Device初始化、中断处理、数据传输的工 作,其余的文件是控制器core层和引导驱动,包括通用接口、通用中断处理和控制器初始化等功能。 重要的接口实现函数: 1 static struct hc_driver dwc2_hc_driver = { 2 .description = "dwc2_hsotg", 3 .product_desc = "DWC OTG Controller", 4 .hcd_priv_size = sizeof(struct wrapper_priv_data), 5 6 .irq = _dwc2_hcd_irq, 7 .flags = HCD_MEMORY | HCD_USB2 | HCD_BH, 8 9 .start = _dwc2_hcd_start, 10 .stop = _dwc2_hcd_stop, 11 .urb_enqueue = _dwc2_hcd_urb_enqueue, 12 .urb_dequeue = _dwc2_hcd_urb_dequeue, 13 .endpoint_disable = _dwc2_hcd_endpoint_disable, 14 .endpoint_reset = _dwc2_hcd_endpoint_reset, 15 .get_frame_number = _dwc2_hcd_get_frame_number, 16 17 .hub_status_data = _dwc2_hcd_hub_status_data, 18 .hub_control = _dwc2_hcd_hub_control, 19 .clear_tt_buffer_complete = _dwc2_hcd_clear_tt_buffer_complete, 20 21 .bus_suspend = _dwc2_hcd_suspend, 22 .bus_resume = _dwc2_hcd_resume, 23 24 25 26 .map_urb_for_dma = dwc2_map_urb_for_dma, .unmap_urb_for_dma = dwc2_unmap_urb_for_dma, }; 27 28 static const struct usb_gadget_ops dwc2_hsotg_gadget_ops = { 29 .get_frame = dwc2_hsotg_gadget_getframe, 30 .udc_start = dwc2_hsotg_udc_start, .udc_stop = dwc2_hsotg_udc_stop, 31 .udc_stop 32 .pullup 33 .vbus_session 34 .vbus_draw 35 = dwc2_hsotg_udc_stop, = dwc2_hsotg_pullup, = dwc2_hsotg_vbus_session, = dwc2_hsotg_vbus_draw, }; Upstream版DWC2驱动在sys/kernel/debug/目录下增加了debug接口: 1 rk3328_box:/sys/kernel/debug/ff580000.usb # ls 2 ep0 3 ep1in ep3in ep2out ep4out ep6out ep8in ep5in ep7in ep9in fifo state ep8out ep9out regdump testmode 接口功能: ep*in/out: Shows the state of the given endpoint (one is registered for each available). fifo: Show the FIFO information for the overall fifo and all the periodic transmission FIFOs. state: shows the overall state of the hardware and some general information about each of the endpoints available to the system. regdump: Gets register values of core. testmode: Modify the current usb test mode. drivers/usb/dwc_otg_310目录下有多个dwc_otg开头的文件,分成三类,一类是文件名包含“hcd”的host相关驱动 文件,主要负责Host初始化、Host中断处理和Host数据传输相关操作,一类是文件名包含“pcd”的Device相关驱 动,主要负责Device初始化、Device中断处理和Device数据传输相关操作,还有一类是Host Device通用驱动,主 要包括通用属性配置、通用中断处理、通用控制器接口、控制器初始化以及“usbdev”开头的PHY相关的设置文件。 重要的接口实现函数: 1 static struct hc_driver dwc_otg_hc_driver = { 2 .description = dwc_otg_hcd_name, 3 .product_desc = "DWC OTG Controller", 4 .hcd_priv_size = sizeof(struct wrapper_priv_data), 5 .irq = dwc_otg_hcd_irq, 6 .flags = HCD_MEMORY | HCD_USB2, 7 /* .reset = */ 8 .start = hcd_start, 9 /* .suspend = */ 10 /* .resume = */ 11 .stop = hcd_stop, 12 .urb_enqueue = urb_enqueue, 13 .urb_dequeue = urb_dequeue, 14 .endpoint_disable = endpoint_disable, 15 16 17 18 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) .endpoint_reset = endpoint_reset, #endif .get_frame_number = get_frame_number, 19 20 .hub_status_data = hub_status_data, 21 .hub_control = hub_control, 22 .bus_suspend = hcd_suspend, .bus_resume = hcd_resume, 23 24 .bus_resume = hcd_resume, }; 25 26 static const struct dwc_otg_pcd_function_ops fops = { 27 28 .complete = _complete, #ifdef DWC_EN_ISOC 29 30 .isoc_complete = _isoc_complete, #endif 31 .setup = _setup, 32 .disconnect = _disconnect, 33 .connect = _connect, 34 .resume = _resume, 35 .suspend = _suspend, 36 .hnp_changed = _hnp_changed, 37 38 .reset = _reset, #ifdef DWC_UTE_CFI 39 .cfi_setup = _cfi_setup, 40 #endif 41 #ifdef DWC_UTE_PER_IO 42 .xisoc_complete = _xisoc_complete, 43 #endif 44 }; 内部版的DWC2驱动在sys/devices/platform目录下实现了多个可配置属性,也可用于调试 1 rk3328_box:/sys/devices/platform/ff580000.usb # ls 2 busconnected fr_interval gsnpsid modalias regoffset uevent 3 buspower gadget guid mode regvalue usb5 4 bussuspend ggpio gusbcfg mode_ch_tim_en remote_wakeup wr_reg_test 5 devspeed gnptxfsiz hcd_frrem pools spramdump 6 disconnect_us gotgctl hcddump power subsystem 7 driver gpvndctl hprt0 rd_reg_test test_sq 8 enumspeed grxfsiz hptxfsiz regdump udc 9 10 rk3328_box:/sys/devices/platform/ff580000.usb/driver # ls 11 bind 12 debuglevel ff580000.usb dwc_otg_conn_en force_usb_mode uevent vbus_status op_state unbind version 接口功能: busconnected: Gets or sets the Core Control Status Register. fr_interval: On read, shows the value of HFIR Frame Interval. On write, dynamically reload HFIR register during runtime. The application can write a value to this register only after the Port Enable bit of the Host Port Control and Status register (HPRT.PrtEnaPort) has been set. gsnpsid: Gets the value of the Synopsys ID Regester. regoffset: Sets the register offset for the next Register Access. buspower: Gets or sets the Power State of the bus (0 - Off or 1 - On). guid: Gets or sets the value of the User ID Register. regvalue: Gets or sets the value of the register at the offset in the regoffset attribute. bussuspend: Suspends the USB bus. ggpio: Gets the value in the lower 16-bits of the General Purpose IO Register or sets the upper 16 bits. gusbcfg: Gets or sets the Core USB Configuration Register. mode_ch_tim_en: This bit is used to enable or disable the host core to wait for 200 PHY clock cycles at the end of Resume to change the opmode signal to the PHY to 00 after Suspend or LPM. remote_wakeup: On read, shows the status of Remote Wakeup. On write, initiates a remote wakeup of the host. When bit 0 is 1 and Remote Wakeup is enabled, the Remote Wakeup signalling bit in the Device Control Register is set for 1 milli-second. wr_reg_test: Displays the time required to write the GNPTXFSIZ register many times (the output shows the number of times the register is written). devspeed: Gets or sets the device speed setting in the DCFG register. gnptxfsiz: Gets or sets the non-periodic Transmit Size Register. spramdump: Dumps the contents of core registers. disconnect_us: On read, shows the status of disconnect_device_us. On write, sets disconnect_us which causes soft disconnect for 100us. Applicable only for device mode of operation. gotgctl: Gets or sets the Core Control Status Register. hcddump: Dumps the current HCD state. gpvndctl: Gets or sets the PHY Vendor Control Register. hprt0: Gets or sets the value in the Host Port Control and Status Register. rd_reg_test: Displays the time required to read the GNPTXFSIZ register many times (the output shows the number of times the register is read). test_sq: Gets or sets the usage of usb controler test_sq attribute. enumspeed: Gets the device enumeration Speed. grxfsiz: Gets or sets the Receive FIFO Size Register. hptxfsiz: Gets the value of the Host Periodic Transmit FIFO. regdump: Dumps the contents of core registers. wc_otg_conn_en: Enable or disable connect to PC in device mode. force_usb_mode: Force work mode of core (0 - Normal, 1 - Host, 2 - Device). vbus_status: Gets the Voltage of VBUS. debuglevel: Gets or sets the driver Debug Level. op_state: Gets or sets the operational State, during transations (a_host>>a_peripherial and b_device=>b_host) this may not match the core but allows the software to determine transitions. version: Gets the Driver Version. 5.2.3 USB2.0 HOST drivers Driver代码路径: drivers/usb/host/ehci* drivers/usb/host/ohci* EHCI控制器使用的是Upstream 版驱动,host 目录下文件名包含“ehci”的为EHCI控制器相关文件,其中文件名包含 厂商名字的为产商引导文件,目前RK没有使用厂商引导文件,而是使用通用引导文件ehci-platform.c进行驱动的加 载与初始化。ehci-hcd.c负责控制整个控制器,实现USB core层HCD控制器接口,ehci-mem.c与ehci-sched.c是控 制器数据传输结构与传输调度的相关代码,ehci-hub.c是EHCI控制器root hub驱动代码。 重要的接口实现函数: 1 static const struct hc_driver ehci_hc_driver = { 2 .description = hcd_name, 3 .product_desc = "EHCI Host Controller", 4 .hcd_priv_size = sizeof(struct ehci_hcd), 5 /* 6 7 * generic hardware linkage */ 8 .irq = ehci_irq, 9 .flags = HCD_MEMORY | HCD_USB2 | HCD_BH, 10 11 12 /* * basic lifecycle operations */ 13 .reset = ehci_setup, 14 .start = ehci_run, 15 .stop = ehci_stop, 16 .shutdown = ehci_shutdown, 17 /* 18 * managing i/o requests and associated device resources 19 */ 20 .urb_enqueue = ehci_urb_enqueue, 21 .urb_dequeue = ehci_urb_dequeue, 22 .endpoint_disable = ehci_endpoint_disable, 23 .endpoint_reset = 24 .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, 25 /* ehci_endpoint_reset, 26 * scheduling support 27 */ 28 .get_frame_number = ehci_get_frame, 29 /* 30 31 * root hub support */ 32 .hub_status_data = ehci_hub_status_data, 33 .hub_control = ehci_hub_control, 34 .bus_suspend = ehci_bus_suspend, 35 .bus_resume = ehci_bus_resume, 36 .relinquish_port = ehci_relinquish_port, 37 .port_handed_over = ehci_port_handed_over, 38 /* 39 * device support */ 40 */ 41 42 .free_dev = ehci_remove_device, }; EHCI驱动在sys/kernel/debug目录下增加了几个debug接口(需要在内核编译的config文件中增加 CONFIG_DYNAMIC_DEBUG),具体接口如下: 1 rk3399_box:/sys/kernel/debug/fe380000.usb # ls 2 async bandwidth periodic registers 接口功能: async: Dump a snapshot of the Async Schedule. bandwidth: Dump the HS Bandwidth Table. periodic: Dump a snapshot of the Periodic Schedule. registers: Dump Capability Registers, Interrupt Params and Operational Registers. OHCI控制器使用的也是Upstream版驱动,host目录下文件名包含“ohci”的是OHCI控制器相关文件,其中文件名包 含厂商名字的为厂商引导文件,与EHCI一样,RK使用ohci-platform.c进行驱动加载和初始化。类似的,ohci-hcd.c 实现USB core层的HCD控制器接口,ohci-mem.c和ohci-q.c是传输数据结构和传输调度相关代码,ohci-hub.c是 OHCI控制器root hub驱动代码。 重要的接口实现函数: 1 static const struct hc_driver ohci_hc_driver = { 2 .description = hcd_name, 3 .product_desc = "OHCI Host Controller", 4 .hcd_priv_size = sizeof(struct ohci_hcd), 5 /* 6 * generic hardware linkage 7 */ 8 .irq = ohci_irq, 9 .flags = HCD_MEMORY | HCD_USB11, 10 /* 11 * basic lifecycle operations 12 */ 13 .reset = ohci_setup, 14 .start = ohci_start, 15 .stop = ohci_stop, 16 .shutdown = ohci_shutdown, 17 /* 18 * managing i/o requests and associated device resources 19 */ 20 .urb_enqueue = ohci_urb_enqueue, 21 .urb_dequeue = ohci_urb_dequeue, 22 .endpoint_disable = ohci_endpoint_disable, 23 /* 24 * scheduling support 25 */ 26 .get_frame_number = 27 /* * root hub support ohci_get_frame, 28 * root hub support 29 */ 30 .hub_status_data = ohci_hub_status_data, 31 .hub_control = ohci_hub_control, 32 #ifdef CONFIG_PM 33 .bus_suspend = ohci_bus_suspend, 34 .bus_resume = ohci_bus_resume, 35 #endif 36 37 .start_port_reset = ohci_start_port_reset, }; OHCI驱动在sys/kernel/debug/usb/目录增加了几个debug接口,具体如下: 1 rk3399_box:/sys/kernel/debug/usb/ohci/fe3a0000.usb # ls 2 async periodic registers 接口功能: async: Display Control and Bulk Lists together, for simplicity periodic: Dump a snapshot of the Periodic Schedule (and load) registers: Dump driver info, then registers in Spec order and other registers mostly affect Frame Timings 6 Android Gadget配置 LinuxKernel4.0,Android5.0及其后版本,Gadget均采用ConfigFs配置,同时内核也删除了Gadget目录下 android.c文件。因此Gadget与之前配置方式有所差异。 关于如何使能Android ConfigFs Gadgets功能,请参考Linaro官网的说明: https://wiki.linaro.org/LMG/Kernel/AndroidConfigFSGadgets 6.1 Gadget驱动配置 请参阅3.4章节 6.2 BOOT IMG配置 在Android boot.img中与USB相关的script主要有: init.usb.rc init.usb.configfs.rc init.rk30board.usb.rc fstab.rk30board.bootmode.emmc 1) init.usb.rc、[init.usb.configfs.rc为Android标准rc文件,一般不需要改动。 2) init.rk30board.usb.rc为我们平台Gadget功能的配置管理文件,其内容主要包括usb_gadget configfs的创建, Gadget描述符的定义(VID/PID)、Gadget function节点的定义等,如下所示: 1 on boot 2 mkdir /dev/usb‐ffs 0770 shell shell 3 mkdir /dev/usb‐ffs/adb 0770 shell shell 4 mount configfs none /config 5 mkdir /config/usb_gadget/g1 0770 shell shell 6 write /config/usb_gadget/g1/idVendor 0x2207 7 write /config/usb_gadget/g1/bcdDevice 0x0310 8 write /config/usb_gadget/g1/bcdUSB 0x0200 9 mkdir /config/usb_gadget/g1/strings/0x409 0770 10 write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} 11 write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} 12 write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} 13 mkdir /config/usb_gadget/g1/functions/accessory.gs2 14 mkdir /config/usb_gadget/g1/functions/audio_source.gs3 15 mkdir /config/usb_gadget/g1/functions/ffs.adb 16 mkdir /config/usb_gadget/g1/functions/mtp.gs0 17 mkdir /config/usb_gadget/g1/functions/ptp.gs1 18 mkdir /config/usb_gadget/g1/functions/rndis.gs4 19 write /config/usb_gadget/g1/functions/rndis.gs4/wceis 1 20 mkdir /config/usb_gadget/g1/functions/midi.gs5 21 mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell 22 mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell 23 write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 24 write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" 25 write /config/usb_gadget/g1/configs/b.1/MaxPower 500 26 symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 27 mount functionfs adb /dev/usb‐ffs/adb uid=2000,gid=2000 28 setprop sys.usb.configfs 1 29 setprop sys.usb.controller "fe800000.dwc3" 30 31 on property:sys.usb.config=none && property:sys.usb.configfs=1 32 write /config/usb_gadget/g1/os_desc/use 0 33 setprop sys.usb.ffs.ready 0 34 35 36 on property:init.svc.adbd=stopped setprop sys.usb.ffs.ready 0 37 38 on property:sys.usb.config=mtp && property:sys.usb.configfs=1 39 write /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "MTP" 40 write /config/usb_gadget/g1/os_desc/use 1 41 write /config/usb_gadget/g1/idProduct 0x0001 42 43 on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 44 write /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "MTP" 45 write /config/usb_gadget/g1/os_desc/use 1 46 write /config/usb_gadget/g1/idProduct 0x0011 47 其中,Serialnumber、manufacturer、product三个属性由Android配置。如果Serialnumber没有配置成功,可 能会造成ADB无法使用。 setprop sys.usb.controller用来使能Gadget对应的USB控制器,RK3399有两个OTG控制器,都可以支持USB Gadget功能,但由于当前USB Gadget driver内核架构只支持一个USB控制器,所以需要根据实际的产品需求来配 置使能对应的USB控制器,如RK3399 Android SDK,默认使能Type-C 0 port的USB Gadget功能: 1 setprop sys.usb.controller "fe800000.usb" 如果要使能Type-C 1 port的USB Gadget 功能,则修改为init.rk30board.usb.rc的sys.usb.controller为 fe900000.usb,参考修改如下: 1 setprop sys.usb.controller "fe900000.usb" 内核提供了设备节点来查看USB Gadget的关键配置信息,在根目录如下: 1 root@rk3399:/ # cd config/usb_gadget/g1/ 2 3 root@rk3399:/config/usb_gadget/g1 # ls 4 UDC 5 bDeviceClass bDeviceSubClass bcdDevice bDeviceProtocol bMaxPacketSize0 bcdUSB functions idVendor strings configs idProduct os_desc 大部分节点的功能,可以直观地看出来,这里就不再赘述。 “UDC”可以确认当前Gadget对应的usb controller, 也可以用于手动选择对应的usb controller。如默认使用Type-C 0 USB Controller,要切换为使用Type-C 1 USB Controller,则手动执行如下的命令: 1 echo none > config/usb_gadget/g1/UDC 2 echo fe900000.dwc3 > config/usb_gadget/g1/UDC 3) fstab.rk30board.bootmode.emmc为Android fstab文件,可以用于配置sdcard、usb的mount路径,RK3399 平台的vold和kernel已经可以做到自动搜索和匹配usb mount路径,不需要再做修改。 # for usb2.0 1 /devices/platform/*.usb* auto vfat defaults voldmanaged=usb:auto # for usb3.0 1 /devices/platform/usb@*/*.dwc3* 7 常见问题分析 7.1 设备枚举日志 7.1.1 USB2.0 OTG正常开机日志 开机未连线,默认为device模式。 auto vfat defaults voldmanaged=usb:auto 1 [ 8.764441]otg id chg last id ‐1 currentid 67108864 2 [ 8.764925] PortPower off 3 [ 8.866923] Using Buffer DMA mode 4 [ 8.867280] Periodic Transfer Interrupt Enhancement‐ disabled 5 [ 8.867787] Multiprocessor InterruptEnhancement ‐ disabled 6 [ 8.868294] OTG VER PARAM: 0, OTG VER FLAG: 0 7 [ 8.868700] ^^^^^^^^^^^^^^^^^Device Mode 7.1.2 USB2.0 Device连接 1 [ 2 [ 133.500590] Using Buffer DMA mode 133.368479] ***vbusdetect* 3 [ 133.500886] Periodic Transfer InterruptEnhancement ‐ disabled 4 [ 133.501391] Multiprocessor InterruptEnhancement ‐ disabled 5 [ 133.501875] OTG VER PARAM: 0, OTG VER FLAG: 0 6 [ 133.502255] ^^^^^^^^^^^^^^^^^Device Mode 7 [ 133.502630] ***************softconnect!!!******************* 8 [ 133.618581] USB RESET 9 [ 133.710877] android_work: sent ueventUSB_STATE=CONNECTED 10 [ 133.714269] USB RESET 11 [ 133.947001] configfs‐gadget gadget: high‐speed config #1: b 12 [ 133.947649] android_work: sent ueventUSB_STATE=CONFIGURED 13 [ 133.995447] mtp_open 7.1.3 USB2.0 Device断开连接 1 [ 187.085682] ********session end ,softdisconnect*********** 2 [ 187.086486] android_work: sent ueventUSB_STATE=DISCONNECTED 3 [ 187.087217] mtp_release 7.1.4 USB2.0 HOST-LS设备 1 [ 325.412454] usb 2‐1: new low‐speed USB device number 2 using ohci‐platform 2 [ 325.619507] usb 2‐1: New USB device found,idVendor=046d, idProduct=c077 3 [ 325.620116] usb 2‐1: New USB device strings:Mfr=1, Product=2, SerialNumber=0 4 [ 325.620809] usb 2‐1: Product: USB OpticalMouse 5 [ 325.621222] usb 2‐1: Manufacturer: Logitech 7.1.5 USB2.0 HOST-FS设备 1 [ 370.896519] usb 2‐1: new full‐speed USB device number 3 using ohci‐platform 2 [ 371.109574] usb 2‐1: New USB device found,idVendor=1915, idProduct=0199 3 [ 371.110183] usb 2‐1: New USB device strings:Mfr=1, Product=2, SerialNumber=0 4 [ 371.110832] usb 2‐1: Product: Memsartcontroller 5 [ 371.111251] usb 2‐1: Manufacturer: Memsart 6 [ 371.123172] input: Memsart Memsart controlleras / 7.1.6 USB2.0 HOST-HS设备 1 [ 405.400521] usb 1‐1: new high‐speed USB device number 5 using ehci‐platform 2 [ 405.536569] usb 1‐1: New USB device found,idVendor=0951, idProduct=1687 3 [ 405.537178] usb 1‐1: New USB device strings:Mfr=1, Product=2, SerialNumber=3 4 [ 405.537815] usb 1‐1: Product: DT R400 5 [ 405.538151] usb 1‐1: Manufacturer: Kingston 6 [ 405.538533] usb 1‐1: SerialNumber:0018F3D97D02BB91517E017D 7 [ 405.541111] usb‐storage 1‐1:1.0: USB MassStorage device detected 8 [ 405.542472] scsi host1: usb‐storage 1‐1:1.0 9 [ 406.584573] scsi 1:0:0:0: Direct‐AccessKingston DT R400 PMAP PQ: 0 ANSI: 0 CCS 10 [ 406.586425] sd 1:0:0:0: Attached scsi genericsg0 type 0 11 [ 408.171256] sd 1:0:0:0: [sda] 15646720512‐byte logical blocks: (8.01 GB/7.46 GiB) 12 [ 408.172788] sd 1:0:0:0: [sda] Write Protectis off 13 [ 408.173970] sd 1:0:0:0: [sda] No Caching modepage found 14 [ 408.174453] sd 1:0:0:0: [sda] Assuming drivecache: write through 15 [ 408.223001] sda: sda1 16 [ 408.229280] sd 1:0:0:0: [sda] Attached SCSIremovable disk 7.1.7 USB2.0 HOST-LS/FS/HS设备断开log 1 [ 443.151067] usb 1‐1: USB disconnect, devicenumber 3 7.1.8 USB3.0 Device连接 1 [ 72.310531] android_work: sent ueventUSB_STATE=CONNECTED 2 [ 72.689120] configfs‐gadget gadget: super‐speed config #1: b 3 [ 72.690110] android_work: sent ueventUSB_STATE=CONFIGURED 4 [ 72.767950] mtp_open 7.1.9 USB3.0 HOST-SS设备 1 [ 26.715320] usb 8‐1: new SuperSpeed USB device number 2 using xhci‐hcd 2 [ 26.732190] usb 8‐1: New USB device found,idVendor=0bc2, idProduct=2320 3 [ 26.732812] usb 8‐1: New USB device strings:Mfr=2, Product=3, SerialNumber=1 4 [ 26.733515] usb 8‐1: Product: Expansion 5 [ 26.733885] usb 8‐1: Manufacturer: Seagate 6 [ 26.734263] usb 8‐1: SerialNumber: NA45HT1K 7 [ 26.738410] usb‐storage 8‐1:1.0: USB MassStorage device detected 8 [ 26.740446] scsi host0: usb‐storage 8‐1:1.0 9 [ 27.745028] scsi 0:0:0:0: Direct‐Access 10 [ 27.753066] sd 0:0:0:0: [sda] 1953525167512‐byte logical blocks: (1.00 TB/932 GiB) 11 [ 27.754245] sd 0:0:0:0: [sda] Write Protectis off 12 [ 27.754982] sd 0:0:0:0: Attached scsi genericsg0 type 0 13 [ 27.755281] sd 0:0:0:0: [sda] Write cache:enabled, read cache: enabled, doesn't support Seagate Expansion DPO or FUA 14 [ 27.783395] sda: sda1 15 [ 27.791561] sd 0:0:0:0: [sda] Attached SCSIdisk 7.2 USB 常见问题分析 7.2.1 软件配置 0608 PQ: 0 ANSI:6 首先必须明确项目中USB控制器是如何分配的,并确保kernel的配置是正确的,请参考第三章配置说明,需要根据 项目的实际使用情况进行配置。主要注意下面几点: 1、如果使用USB2.0 HOST控制器,请配置对EHCI/OHCI配置,否则不支持。 2、OTG // TODO: 7.2.2 硬件电路 在同时使用多个控制器对应同一个USB口,或者一个控制器对应多个USB口时,可能会使用电子开关来切换USB信 号及电源。需要确保不同控制器的电源控制是互相独立的,通过电子开关后,控制器与USB口之间的连接是有效 的。 场景一: 1个硬件USB口同时支持host和device功能,使用USB2.0 HOST控制器作为host和USB2.0 OTG控制器作为 device,通过硬件电子开关进行切换。 需要保证工作于host状态时,USB信号是切换到USB2.0 HOST控制器,而VBUS是由HOST供电电路提供,而不影 响device的VBUS电平检测电路。工作于device状态时,USB信号是切换到USB2.0 OTG控制器,VBUS由PC通过 USB线提供。 场景二: 使用一个USB2.0 OTG控制器,对应使用两个硬件USB口分别是host和device。通过电子开关进行信号切换。 工作于HOST状态时,USB2.0 OTG的DP/DM信号线是切换到HOST口,且HOST口VBUS提供5V 500MA的供电;工 作于device状态时DP/DM信号是切换到device口,VBUS电平检测电路只检测PC提供的5V供电。 7.2.3 Device功能异常分析 USB Device正常连接至PC的现象主要有: 1. 串口输出正常log见7.1.2 USB2.0 Device连接](#_6.1.2_Device连接); 2. PC出现盘符,但默认不能访问;(Windows 7和MAC OS可能只出现在设备管理器); 3. 设备UI状态栏出现”USB已连接”标识; 4. 打开USB已连接的提示窗口,默认为charger only模式,选择“MTP”或者“PTP”后,PC可以访问盘符。 常见异常排查: 1、 连接USB时串口完全没有log: (1) USB硬件信号连接正确; (2) USB控制器确保工作在device状态; (3) 测量USB_DET信号电压,USB连接时应该 由低到高。 2、 连接失败,PC显示不可识别设备,log一直重复打印: 1 [36.682587] DWC_OTG: ********softconnect!!!***************************************** 2 [36.688603] DWC_OTG: USB SUSPEND 3 [36.807373] DWC_OTG: USB RESET 但是没有正常log中的后面几条信息。一般为USB硬件信号差,无法完成枚举。 3、 连接PC后,kernel log正常,并且设备为出现USB已连接”标识,但PC无法访问设备 驱动工作正常,请先确认是否有选择USB为“MTP”或“PTP”,如果已选择,则可能是Android层异常,请截取logcat 内容,并请负责维护vold/mtpserver代码的Android工程师帮忙debug。 4、 连接PC正常,并能正常访问,拷贝文件过程中提示拷贝失败。 可能原因是: (1) USB信号质量差。可测试下USB眼图,并使用USB分析仪抓取数据流后分析。 (2) Flash/SD卡读写超时,log一般为连接Window XP时约10S出现一次重新连接的log。 (3) Flash/SD磁盘分区出错,导致每次拷贝到同一个点时失败。可使用命令检查并修复磁盘分区。假设挂载的磁盘 分区为E,则打开Windows命令提示符窗口,输入命令:chkdsk E: /f 5、 USB线拔掉后UI状态栏仍然显示“USB已连接”,或USB线拔掉时只有以下log: 1 [25.330017] DWC_OTG: USB SUSPEND 而没有下面的log: 1 [25.514407] DWC_OTG: session end intr, softdisconnect VBUS异常,一直为高,会影响USB检测及系统休眠唤醒,请硬件工程师排查问题。 7.2.4 Host功能异常分析 USB HOST正常工作情况如下: 1. 首先 HOST电路提供5V,至少500mA的供电; 2. 如果有USB设备连接进来,串口首先会打印HOST枚举USB设备的log(见7.1.4至7.1.7),表明USB设备已经通过 HOST的标准设备枚举; 常见异常及排查: 1. HOST口接入设备后,串口无任何打印: (1) 首先需要确认通过电子开关后的电路连接正确; (2) 确认控制器工作于HOST状态,并确认供电电路正常。 2. 串口有HOST枚举USB设备内容,但是没有出现class驱动的打印信息。 Kernel没有加载class驱动,需要重新配置kernel,加入对应class驱动支持。 3. kernel打印信息完整(USB标准枚举信息及CLASS驱动信息),已在Linux对应位置生成节点,但是Android层无 法使用。 Android层支持不完善,如U盘在kernel挂载完成/dev/block/sda节点后,需要Android层vold程序将可存储介质挂 载到/udisk提供媒体库,资源管理器等访问,同样鼠标键盘等HID设备也需要Android层程序支持。 U盘枚举出现/dev/block/sda后仍然无法使用,一般是vold.fstab中U盘的mount路径有问题,如果vold.fstab代码 如下(系统起来后可直接cat/system/etc/vold.fstab 查看): 1 dev_mount udisk /mnt/udisk 1 /devices/platform/usb20_HOST/usb2 而实际的device路径可能是在usb20_OTG控制器下或者最后的字段为usb1. 如果设备属于这种情况的无法正常使用,需要联系Android工程师帮忙debug。 4. 串口一直打印如下提示字节没有对齐的类似log: 1 DWC_OTG:dwc_otg_hcd_urb_enqueue urb‐>transfer_buffer address not align to 4‐byte0xd6eab00a 2 DWC_OTG:dwc_otg_hcd_urb_enqueue urb‐>transfer_buffer address not align to 4‐byte0xccf6140a RK平台的USB驱动要求在提交URB传输请求时, URB的成员transfer_buffer地址必须为四字节对齐,否则会提示 上述错误log。 如:函数usb_control_msg的data参数必须要四字节对齐。 5. OTG口作为host时,无法识别接入的设备 (1) 检查Kernel的OTG配置是否正确; (2) 检查OTG电路的ID电平(作host,为低电平)和VBUS 5V供电是否正常; (3) 如果确认1和2都正常,仍无法识别设备,请提供设备插入后无法识别的错误log给我们。 7.2.5 USB Camera异常分析 1. 使用Camera应用,无法打开USB camera 首先,检查/dev目录下是否存在camera设备节点video0或video1,如果不存在,请检查kernel的配置是否正确, 如果存在节点,请确认USB camera是在系统开机前插入的,因为RK平台的SDK,默认是不支持USB camera热拔 插的。如果要支持USB camera热拔插,请联系负责camera的工程师修改Android相关代码,USB驱动不需要做修 改。 如果仍无法解决,请提供log给负责USB驱动工程师或者负责camera的工程师,进一步分析。 2. 出现概率性闪屏、无图像以及camera应用异常退出的问题 可能是USB驱动丢帧导致的。需要使用USB分析仪抓实际通信的数据进行分析,如果无法定位,请联系负责USB驱 动的工程师。 7.2.6 USB充电检测 USB2 PHY支持BC1.2标准的充电检测,代码实现请参考drivers/phy/rockchip/phy-rockchip-inno-usb2.c, 可以 检测SDP/CDP/标准DCP(D+/D-短接)/非标准DCP(D+/D-未短接)四种充电类型。 l SDP —— Standard Downstream Port 根据USB2.0规范,当USB外设处于未连接(un-connect)或休眠(suspend)的状态时,一个Standard Downstream Port可向该外设提供不超过2.5mA的平均电流;当外设处于已经连接并且未休眠的状态时,电流可以至最大 100mA(USB3.0 150mA);而当外设已经配置(configured )并且未休眠时,最大可从VBUS获得500mA(USB3.0 900mA)电流。 l CDP —— Charging Downstream Port 即兼容 USB2.0 规范,又针对 USB 充电作出了优化的下行USB 接口,提供最大1.5A的供电电流,满足大电流快速 充电的需求。 l DCP —— Dedicated Charging Port (USB Charger) BC1.2 spec要求将USB Charger中的D+和D-进行短接,以配合USB外设的识别动作,但它不具备和USB设备通信的 能力。 USB充电类型检测流程见下图所示: 图 7‐1 USB充电检测流程 典型的SDP 检测过程中,D+/D-波形如下图所示: 图 7‐2 SDP检测波形 典型的DCP 检测过程中,D+/D-波形如下图所示: 图 7‐3 DCP检测波形 如果连接USB充电器,发现充电慢,有可能是DCP被误检测为SDP,导致充电电流被设置为500mA。当USB线连接 不稳定或者充电检测驱动出错,都可能会产生该问题。解决方法: 抓取USB充电器连接的log,通过log的提示判断检测的充电类型,正常应为DCP; 如果连接的是USB充电器,但log提示为SDP,则表示发生了误检测。请先更换USB线测试,并使用万用表确认 D+/D-是否短接。如果仍无法解决,请将检测的log发给我们测试。同时,如果有条件,请使用示波器抓USB插入时 的D+/D-波形,并连同log一起发送给我们分析和定位问题。 如果连接的是USB充电器,并且log提示为DCP,但充电仍然很慢,则表明软件检测正常,可能是充电IC或者电池的 问题。 7.3 PC驱动问题 所有USB设备要在PC上正常工作都是需要驱动的,有些驱动是标准且通用的,而有些驱动是需要额外安装的。对于 RK的设备连接到PC后,需要安装驱动的情况有两种的设备,需要分别选择对应的驱动。 1. 生成后未烧写的裸片或者进入升级模式后的RK设备,会以rockUSB的模式连接到PC,需要在PC端使用RK平台 专门的驱动安装助手DriverAssitant(RK3399需要v4.4支持)安装驱动才能识别到USB设备; 2. RK的设备正常运行时,在设置里面打开了USB debugging选项,连接时会以ADB的模式连接PC,同样需要在 PC端使用RK平台专门的驱动安装助手DriverAssitant安装ADB驱动后,才能正常识别到ADB设备。 8 USB信号测试 [USB2.0/3.0信号测试方法及常见问题分析请参阅《RK USB Compliance Test NoteV1.2》
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Creator : Typora Producer : Typora Create Date : 2018:01:24 09:46:22 Modify Date : 2018:01:24 09:46:22 Page Count : 47 Page Mode : UseOutlines Warning : [Minor] Ignored duplicate Info dictionaryEXIF Metadata provided by EXIF.tools