USB模块的ID引脚和VBUS引脚说明

具体功能说⽤

硬件_ID_引脚(输⼊)

ID引脚(君正的ID悬空情况下已默认上拉)⽤于确定OTG作为Host还是Device。具体的规则如下表

ID引脚状态USB工作模式
高电平USB设备
低电平USB主机

硬件_VBUS_引脚(输⼊)

当OTG⼯作在Host或Device模式下,VBUS引脚作⽤不同。具体模式下的作⽤⻅下表格

Host模式Device模式
用于过流检测插入上电状态检测

断开连接状态检测

注意:硬件VBUS引脚存在,才能⽀持BC1.2。

_GPIO_模拟的_DRVVBUS_引脚(输出)

在Host模式下,GPIO模拟的DRVVBUS⽤于控制外围器件是否输出VBUS。

君正不同芯⽚平台差异说明

存在硬件_ID_引脚和_VBUS_引脚

这⾥以X2580为例,X2580的DS中关于ID引脚和VBUS引脚的具体描述如下:

图片.png

可知,X2580芯⽚拥有专⻔的硬件ID引脚和VBUS引脚,所以在芯⽚USB硬件⽀持前⾯功能描述中说明的功能。

硬件上,VBUS接到USB座⼦的VBUS(注意分压)上,USB0ID接到USB座⼦的ID(注意上拉,下图的ID未接到

USB座⼦的ID),具体接法⻅下:

图片.png

需注意,下图的VBUS连接设计存在⼀定功耗

图片.png

同时软件上,在menuconfig界⾯进⾏配置,不勾选 External Id Pin for OTG(选中则OTG控制器将运⾏在强制模式下,运⾏模式仅受软件控制,不受硬件的ID和VBUS的状态影响)和 External Vbus Detect for OTG (选中则不使⽤ DS中描述的PHY硬件VBUS引脚的功能),意味着启⽤芯⽚USB硬件的检测功能。对应配置效果如下图所⽰:

图片.png

即可正常使⽤USB功能。

不存在硬件_ID_引脚和_VBUS_引脚

这⾥以X2670为例,X2670的DS中关于ID引脚和VBUS引脚的具体描述如下:

图片.png

可知,X2670芯⽚没有专⻔的硬件ID引脚和VBUS引脚,故其在芯⽚USB硬件层⾯不⽀持前⾯功能描述中说明的功能,具体存在问题和解决⽅法如下:

不存在硬件ID引脚,存在问题和解决⽅法

问题1:⽆法⾃动切换OTG的运⾏模式。

解决⽅法有2种:

  1. 优先建议使⽤⼿动软件覆盖PHY的ID状态(需要SOC⽀持),实现OTG运⾏模式切换

    硬件上,使⽤该⽅式切换OTG的运⾏模式,需要该SOC⽀持。

确认⽅法:这⾥以使⽤的X2670为例,可以通过查阅PM⼿册的Clock Reset and Power Controller 章节,在寄存器列表找到USB0 Reset Detect Timer Register(USB0RDT,0x40),可以发现存在 IDDIG_EN和IDDIG_REG,说明该芯⽚⽀持通过软件覆盖PHY的ID状态,进⽽实现OTG的模式切换。

图片.png

软件上,在menuconfig界⾯配置不勾选External Id Pin for OTG,效果如下图所⽰

图片.png

然后,在开发板启动后,通过下述命令找到覆盖PHY的ID状态的软件控制节点

# find / -name "sw_switch_hsotg"
/sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsot

可以发现存在1个控制节点,是属于OTG的。

接着,可以通过下列命令切换OTG的运⾏模式,并且在执⾏后有相关的提⽰信息

# 切换为Host模式
# echo host > /sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsotg
[ 2638.257007] ---Forced switching Host mode!
# 切换为Device模式
# echo device > /sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsotg
[ 2648.432793] ---Forced switching Device mode!
# 根据实际的ID状态确定运行模式
# echo none > /sys/devices/platform/apb/10000000.otg_phy/sw_switch_hsotg
[ 2659.896582] ---switching mode from pin!

注意:使⽤该⽅式,硬件VBUS引脚功能不会失效。

  1. 通过额外设计,实现⾃动切换OTG运⾏模式。

在硬件上,可以分配⼀个IO(注意上拉)替代USB_ID接⼊到USB座⼦的ID上。这⾥假设从SOC分配⼀个PC27来替换专⻔的USB_ID。

在软件上,menuconfig配置为不勾选External Id Pin for OTG(选中则OTG控制器将运⾏在强制模式下,运⾏模式仅受软件控制,不受硬件的ID和VBUS的状态影响),效果如下图⽰

图片.png

同时,需要在使⽤的PHY节点添加如下描述

ingenic,id-dete-gpio = <&gpc 27 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

效果类似下图所⽰:

图片.png

这样,就实现了当PC27为低电平时,OTG运⾏模式为Host;当PC27为⾼电平时,OTG运⾏模式为Device。

不存在硬件VBUS引脚,存在问题和解决⽅法

在不存在专⻔的硬件VBUS引脚的情况下,必须勾选 External Vbus Detect for OTG 项来屏蔽PHY的硬件VBUS功能。若不勾选的情况下,插⼊设备会⼀直触发过流检测。

图片.png

问题1:在Host模式下,⽆法进⾏过流检测

解决⽅法略。

问题2:在Device模式下,⽆法⽀持BC1.2

该SOC不⽀持BC1.2。

问题3:在Device模式下,⽆法检测USB的插⼊拔出状态

解决⽅法分2种:

  1. 不需要检测USB的插⼊拔出状态

这种情况下,仅需软件上需要屏蔽PHY的硬件VBUS功能。配置⽅法为通过menuconfig,开启External Vbus Detect for OTG选项即可。

  1. 需要检测USB插⼊拔出状态

硬件上:需要从SOC的引脚⾥⾯分配1个IO,替代VBUS(注意分压到IO能接受的电平,避免烧毁损坏SOC)连接到USB接⼝的VBUS上。硬件设计可参考下图

图片.png

软件上:⾸先在menuconfig配置⻚⾯,开启External Vbus Detect for OTG选项,屏蔽PHY的硬件VBUS功能。然后,根据实际分配的IO来配置设备树中的对应PHY属性。

这⾥假设分配PC00替代VBUS连接到USB接⼝的VBUS上,那么需要在使⽤的对应PHY设备节点中添加如下内容

ingenic,vbus-dete-gpio = <&gpc 00 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

添加到设备树的GPIO_ACTIVE_HIGH 意味当触发VBUS探测事件时,若PC00的电平为⾼,则检测到接⼊;若PC00为低时,则检测到连接断开。

配置效果类似下图所⽰

图片.png

即可通过其他IO替代特定的VBUS引脚,实现USB的插⼊拔出检测。

不存在专⻔的硬件DRVVBUS引脚,存在问题和解决⽅法

问题1:在Host模式下,⽆法控制VBUS的输出状态

解决⽅法分2种:

  1. 不需要控制VBUS输出状态,⼀直输出VBUS。

  2. 通过特殊设计,实现对VBUS输出状态控制,具体⽅法如下:

硬件上,可以根据实际情况,任意分配⼀个IO接⼊到类似WS4612EAA-5/TR芯⽚的VBUS输出控制芯⽚EN上,在满⾜某些条件后,再通过IO使能类似WS4612EAA-5/TR的芯⽚输出VBUS给USB设备供电。具体参考下图设计:

图片.png

这⾥假设分配PB28接⼊VBUS输出控制芯⽚WS4612EAA-5/TR的EN上,VBUS输出控制芯⽚WS4612EAA-5/TR输出条件为PB28为⾼电平。

则在软件上,需要在使⽤的PHY设备节点下添加如下内容

ingenic,drvvbus-gpio = <&gpb 28 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

GPIO_ACTIVE_HIGH 说明当PB28输出⾼电平时,使能输出VBUS。

设备树配置效果图如下

图片.png

即可实现当ID为低电平时,PB28对应输出⾼电平,进⽽对VBUS的输出进⾏控制。