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引脚的具体描述如下:

可知,X2580芯⽚拥有专⻔的硬件ID引脚和VBUS引脚,所以在芯⽚USB硬件⽀持前⾯功能描述中说明的功能。
硬件上,VBUS接到USB座⼦的VBUS(注意分压)上,USB0ID接到USB座⼦的ID(注意上拉,下图的ID未接到
USB座⼦的ID),具体接法⻅下:

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

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

即可正常使⽤USB功能。
不存在硬件_ID_引脚和_VBUS_引脚
这⾥以X2670为例,X2670的DS中关于ID引脚和VBUS引脚的具体描述如下:

可知,X2670芯⽚没有专⻔的硬件ID引脚和VBUS引脚,故其在芯⽚USB硬件层⾯不⽀持前⾯功能描述中说明的功能,具体存在问题和解决⽅法如下:
不存在硬件ID引脚,存在问题和解决⽅法
问题1:⽆法⾃动切换OTG的运⾏模式。
解决⽅法有2种:
优先建议使⽤⼿动软件覆盖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的模式切换。

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

然后,在开发板启动后,通过下述命令找到覆盖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引脚功能不会失效。
通过额外设计,实现⾃动切换OTG运⾏模式。
在硬件上,可以分配⼀个IO(注意上拉)替代USB_ID接⼊到USB座⼦的ID上。这⾥假设从SOC分配⼀个PC27来替换专⻔的USB_ID。
在软件上,menuconfig配置为不勾选External Id Pin for OTG(选中则OTG控制器将运⾏在强制模式下,运⾏模式仅受软件控制,不受硬件的ID和VBUS的状态影响),效果如下图⽰

同时,需要在使⽤的PHY节点添加如下描述
ingenic,id-dete-gpio = <&gpc 27 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;
效果类似下图所⽰:

这样,就实现了当PC27为低电平时,OTG运⾏模式为Host;当PC27为⾼电平时,OTG运⾏模式为Device。
不存在硬件VBUS引脚,存在问题和解决⽅法
在不存在专⻔的硬件VBUS引脚的情况下,必须勾选 External Vbus Detect for OTG 项来屏蔽PHY的硬件VBUS功能。若不勾选的情况下,插⼊设备会⼀直触发过流检测。

问题1:在Host模式下,⽆法进⾏过流检测
解决⽅法略。
问题2:在Device模式下,⽆法⽀持BC1.2
该SOC不⽀持BC1.2。
问题3:在Device模式下,⽆法检测USB的插⼊拔出状态
解决⽅法分2种:
不需要检测USB的插⼊拔出状态
这种情况下,仅需软件上需要屏蔽PHY的硬件VBUS功能。配置⽅法为通过menuconfig,开启External Vbus Detect for OTG选项即可。
需要检测USB插⼊拔出状态
硬件上:需要从SOC的引脚⾥⾯分配1个IO,替代VBUS(注意分压到IO能接受的电平,避免烧毁损坏SOC)连接到USB接⼝的VBUS上。硬件设计可参考下图

软件上:⾸先在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为低时,则检测到连接断开。
配置效果类似下图所⽰

即可通过其他IO替代特定的VBUS引脚,实现USB的插⼊拔出检测。
不存在专⻔的硬件DRVVBUS引脚,存在问题和解决⽅法
问题1:在Host模式下,⽆法控制VBUS的输出状态
解决⽅法分2种:
不需要控制VBUS输出状态,⼀直输出VBUS。
通过特殊设计,实现对VBUS输出状态控制,具体⽅法如下:
硬件上,可以根据实际情况,任意分配⼀个IO接⼊到类似WS4612EAA-5/TR芯⽚的VBUS输出控制芯⽚EN上,在满⾜某些条件后,再通过IO使能类似WS4612EAA-5/TR的芯⽚输出VBUS给USB设备供电。具体参考下图设计:

这⾥假设分配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。
设备树配置效果图如下

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