Rockchip RK3399 - USB OTG和extcon驱动
----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4开发板
eMMC :16GB
LPDDR3 :4GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot :2023.04
linux :6.3
----------------------------------------------------------------------------------------------------------------------------
一、USB OTG
USB是主从模式的总线,主机称为Host,丛机称为Device(设备)。从机与从机之间、主机与主机之间(不包括USB4.0),不能互联。每次通信都是由主机发起,从机不能主动发起通信,只能被动的应答主机的请求。
USB OTG(On-The-Go)是一个扩展的USB标准,允许USB设备之间直接进行通信,而无需通过主机。这意味着设备可以在作为主机和从机之间切换角色,实现了更灵活的连接方式。例如,两台智能手机之间可以通过USB OTG直接连接并共享文件,而无需依赖计算机作为中介。
1.1 概述
对于标准USB2.0来说,一共有4根引脚,一对差分线D+/D-,还有地线GND、电源线VBUS。
对于标准USB3.0来说:一共有9根引脚,为了兼容USB2.0除了拥有USB2.0的一对差分线D+/D-、以及地线GND、电源线VBUS外,还会拥有两对差分线(SSTX+和SSTX-及SSRX+和SSRX-)和一根屏蔽地线;
USB2.0 OTG在标准USB2.0基础上增加了一根USB ID线,使用USB2.0 OTG的设备是可以通过ID脚位来判断其做为主机或是从机用途;
| 引脚 | 名称 | 线缆颜色 | 描述 |
|---|---|---|---|
| 1 | VBUS | 红色 | +5V供电 |
| 2 | D- | 白色 | 差分数据- |
| 3 | D+ | 绿色 | 差分数据+ |
| 4 | ID | N/A | ID引脚为低电平时,则作为主机,此时VBUS需要为连接的USB设备供电 ID引脚悬空(高电平),则作为从机,此时VSBUS由连接的USB主机供电 |
| 5 | GND | 黑色 | 地 |
对于支持OTG功能的USB控制器,我们称之为USB OTG控制器。USB OTG控制器的工作模式有三种(通过程序控制):OTG、Device、Host;
OTG:同时支持主机/从机,工作在这种模式时,我们可以通过ID和VBUS两个脚的状态来识别是否接入了USB主机或USB设备;Device:作为USB从机使用,由连接的USB主机提供VBUS电源;Host:作为USB主机使用,可以外接USB设备,比如鼠标,键盘,并为所连接的USB设备提供VBUS电源;
USB常见的接口有USB Type-A/B/C三种,其中Type-A/B又有标准A/B、Mini-A/B和Micro-A/B三种。无论是 Type-A、Type-B还是Type-C接口,只要设备支持USB OTG功能,就可以在两个设备之间实现直接连接和数据传输。实物图如下图所示:
接下来我们介绍一下这三种不同的接口是如何识别接入的是USB主机还是USB设备。
1.2 Type-A/B接口
1.2.1 Type-A
Type-A接口主要包括:标准Type-A、Mini-A、Micro-A三种,每种接口有多少引脚呢?
| 接口 | 协议 | 引脚 |
|---|---|---|
| Type-A(标准) | USB1.0/2.0 | VBUS、D+/D-、GND |
| Type-A(标准) | USB3.0 | VBUS、D+/D-、GND 两对差分线(SSTX+和SSTX以及SSRX+和SSRX-)和一根屏蔽地线 |
| Mini-A | USB1.0/2.0 | VBUS、D+/D-、GND、ID |
| Mini-A | USB3.0 | 未定义 |
| Micro-A | USB1.0/2.0 | VBUS、D+/D-、GND、ID |
| Micro-A | USB3.0 | 未定义 |
1.2.1 Type-B
Type-B接口主要包括:标准Type-B、Mini-B、Micro-B三种,每种接口有多少引脚呢?
| 接口 | 协议 | 引脚 |
|---|---|---|
| Type-B(标准) | USB1.0/2.0 | VBUS、D+/D-、GND |
| Type-B(标准) | USB3.0 | VBUS、D+/D-、GND 两对差分线(SSTX+和SSTX以及SSRX+和SSRX-)和一根屏蔽地线 |
| Mini-B | USB1.0/2.0 | VBUS、D+/D-、GND、ID |
| Mini-B | USB3.0 | VBUS、D+/D-、GND、ID 两对差分线(SSTX+和SSTX以及SSRX+和SSRX-)和一根屏蔽地线 |
| Micro-B | USB1.0/2.0 | VBUS、D+/D-、GND、ID |
| Micro-B | USB3.0 | VBUS、D+/D-、GND、ID 两对差分线(SSTX+和SSTX以及SSRX+和SSRX-)和一根屏蔽地线 |
这里不做过多展开介绍,更多可以参考:《USB2.0、USB3.0和typec引脚定义》。
1.2.3 角色识别
对于有ID引脚的USB接口,可通过VBUS和ID两个脚的状态来识别是否接入了USB主机或USB设备;
(1) 当OTG设备(SoC USB OTG端口)插入USB主机(比如PC的Type-A),USB主机会给USB从机VUSB供电,VBUS_ON引脚检测到上升沿,触发中断。OTG设备会对ID引脚进行状态检测,当检测到高电平时,OTG设备切换成从机模式;
切换成从机模式后,USB DP(高速设备为DP,低速设备为DM)上产生一个高电平脉冲,此时PC识别到一个USB设备插入,windows会提示用户。
(2) 当USB从设备(OTG连接线+U盘,micro USB的第4脚是直接连到GND的)插入OTG设备(SoC USB OTG端口)时。SoC USB OTG端口的ID引脚检测到下降沿,OTG设备切换成主机模式。
切换成主机模式后,主设备通常会将VBUS_DRV拉高,然后通过限流电路给从设备供电,这时候USB DP(高速设备为DP,低速设备为DM)上可以测试到高电平脉冲。
于是软件可以通过主动读取这两个脚的电平或者异步响应这两个脚的中断来获知状态的变化。从而控制USB OTG控制器工作在主机/从机模式。
需要注意的是:上图绘制只有5根接线,如果是USB3.0通信协议,还会有两对差分线(SSTX+和SSTX以及SSRX+和SSRX-)和一根屏蔽地线。
1.3 Type-C
1.3.1 介绍
Type-C接口又叫USB-C接口。Type-C接口尺寸为8.3×2.5毫米,小于当前PC的Type-A接口,但略大于Micro-B接口。Type-C相对于其它接口的优势:
- 可选集成
DisplayPort、HDMI,用于视频传输; - 通过
USB Power Delivery技术,可用于3C产品(如笔记本电脑、智能手机)的充电; - 它无需区分正反;
Type-C规格所定义的插座及缆线可让使用者在插入其产品与缆线时,毋须考虑连接器的位置(正反皆可)。缆线两端皆可使用Type-C插头,如有需要亦可在缆线一端使用旧型Type-A/B插头。
为了满足更高频宽的应用,Type-C规格在连接器中加入了多组USB3.0TX/RX差分线。
1.3.2 引脚
(1) Type-C母头
(2)Type-C公头
Type-C接口比Type-A/B接口的引脚多多了,标准的Type-C接口有24个引脚,共有有4对TX/RX差分线,2对USBD+/D-,一对SBU,2个CC,另外还有4个VBUS和4个地线;
| 针 | 名 | 描述 | 针 | 名 | 描述 |
|---|---|---|---|---|---|
| A1 | GND | 接地 | B12 | GND | 接地 |
| A2 | SSTXp1 | SuperSpeed差分信号#1,TX,正 | B11 | SSRXp1 | SuperSpeed差分信号#1,RX,正 |
| A3 | SSTXn1 | SuperSpeed差分信号#1,TX,负 | B10 | SSRXn1 | SuperSpeed差分信号#1,RX,负 |
| A4 | VBUS | 总线电源 | B9 | VBUS | 总线电源 |
| A5 | CC1 | Configuration channel | B8 | SBU2 | Sideband use (SBU) |
| A6 | Dp1 | USB 2.0差分信号,position 1,正 | B7 | Dn2 | USB 2.0差分信号,position 2,负 |
| A7 | Dn1 | USB 2.0差分信号,position 1,负 | B6 | Dp2 | USB 2.0差分信号,position 2,正 |
| A8 | SBU1 | Sideband use (SBU) | B5 | CC2 | Configuration channel |
| A9 | VBUS | 总线电源 | B4 | VBUS | 总线电源 |
| A10 | SSRXn2 | SuperSpeed差分信号#2,RX,负 | B3 | SSTXn2 | SuperSpeed差分信号#2,TX,负 |
| A11 | SSRXp2 | SuperSpeed差分信号#2,RX,正 | B2 | SSTXp2 | SuperSpeed差分信号#2,TX,正 |
| A12 | GND | 接地 | B1 | GND | 接地 |
引脚功能描述如下:
| 功能 | 引脚 | 描述 |
|---|---|---|
| USB3 | A2,A3,B2,B3,A10,A11,B10,B11 | USB3数据传输 |
| USB2.0 | A6/B6(D+),A7/B7(D-) | USB2.0数据传输 |
| 配置 | CC1,CC2 | 配置功能接口,插拔检测,供电协议信息传输,VCONN功能 |
| 辅助信号 | SBU1,SBU2 | 辅助信号 |
| 供电 | VBUS,VCONN,GND | 供电 |
Type-C插座中明显消失的是之前Type-A和Type-B接头的ID引脚。在Type-C中,使用配置通道 (CC) 引脚这种不同的处理方式来决定设备是作为主机,还是作为外设。CC引脚所执行的功能与ID引脚之前执行的功能一样;它们表明了设备是作为主机、设备,还是兼具二者的功能。接下来我们重点介绍CC引脚的功能。
1.3.3 DFP/UFP/DRP
在USB规范中为主机、从机定义了两个专业术语:
DFP(Downstream Facing Port):Source,下行端口,可以理解为一个主机,DFP作为source给VBUS和VCCON供电的,简单理解为一个提供电源的设备,如:电源适配器;UFP(Upstream Facing Port):Sink,上行端口,可以理解为从机,UFP可以理解为受电端口,DFP为供电端口,UFP从VBUS中取电,并可提供数据。典型设备如:U盘、移动硬盘;
在USB规范中如果一个设备的接口是DFP,则其必然是主机或者说具有主机的功能,一个接口是UFP,则其必然是从设备或者说其具有从设备的功能。
而在Type-C规范中,对原有的两种角色进行了扩充和重定义等,在Type-C规范中定义了DRP(Dual Role port),DRP可以做为DFP也可以做为UFP,可以供电,也可以受电;典型设备是:笔记本电脑、充电宝;
- 当
DPR接到UFP装置,DRP会转换为DFP; - 当
DRP接到DFP装置,DRP会转换为UFP; - 当两个
DRP装置接在一起,两个装置会Random地,一方为DFP,一方为UFP;
充电宝为UFP(Sink)的应用:电源适配器给充电宝充电。
充电宝为DFP(Source)的应用:充电宝给手机或其他设备充电。
1.3.4 角色识别
Type-C的接口双方角色的识别其实是通过Type-C接口中的两根CC线进行检测设置的。如下图所示:
注:这里的线缆器件是指有eMark芯片的线缆会用到VCONN供电,当一个CC 确认方向后Source端的另一个CC会切换成VCONN为eMark供电,带有eMark芯片的线缆能通过CC与设备进行通信,反馈此线缆的温度,承受电流能信息,对于大功率充电的安全性还是有很大帮助的。
上图中左侧为DFP,右侧为UFP:
-
DFP作为供电方,接口的两根CC线上会加上上拉电阻(Rp); -
UFP作为耗电方,接口的两根CC线上会加上下拉电阻(Rd)。 -
两个接口相连时,
DFP识别出对方的Rd下拉时,则认为连接成功并且检测出对方的角色是耗电方; -
当
UFP识别出对方的Rp上拉时,则认为连接成功并且检测出对方的角色是供电方; -
如果两个同是供电方或者耗电方的接口相连,那么双方都不能识别出想要的
Rd下拉或者Rp上拉,双方都不能工作。
对于双重角色(DRP) 接口,两根CC上会在Rp上拉状态和Rd下拉状态这两种状态中不断地切换;
- 当与非双重角色设备连接时,如果对方是
Rp上拉,此接口会停在Rd下拉的状态,此时接口的供电角色为耗电方: - 如果对方是
Rd下拉,此接口会停在Rp上拉的状态,此时接口的供电角色为供电方; - 当与双重角色设备相连时, 双方会随机地停在
Rp上拉状态或Rd下拉状态,当一方停在Rp上拉状态且另一方停在Rd下拉状态时,连接就此建立;停在Rp上拉状态的一方是供电方,停在Rd下拉状态的一方是耗电方。
在Type-C规范中,定义了Type-C的状态机,从Unattached状态走到Attached Sink状态(做为设备)或者Attached Source状态(做主机),主控芯片内部是有相应的控制器的,控制器会通过寄存器汇报状态变化,并产生中断通知主控。Type-C控制器需要软件进行相应的编程来配置和使能它;

我们使用NanoPC-T4开发板的Type-C接口上连接了Fusb302芯片, 其是一款由Fairchild公司推出的 USB Type-C Controller芯片,它集成了CC(Configuration Channel)控制器和Type-C Port控制器。其具有一下主要特征:
- 具备自主
DRP切换的双重角色功能; - 根据已连接的设备选择作为
Host(主机)或Device(从机)进行连接; - 通过软件配置为
Host(主机)、Device(从机)或双重角色; - 支持
USB功率传递(PD)2.0: - 通过
I2C总线接口,可与主控芯片进行通信和控制,实现更丰富的功能和特性。
1.3.5 功率检测
Type-C规范中根据不同的供电方不同的Rp阻值告诉耗电方自己默认的供电电流能力,而耗电方Rd的电阻值一般固定;
| 供电电流能力 | Rp值(电流驱动) | Rp值(5V驱动) | Rp值(3.3V驱动) |
|---|---|---|---|
| 900mA | 80uA±20% | 56kΩ±20% | 36kΩ±20% |
| 1.5A | 180uA±20% | 22kΩ±20% | 12kΩ±20% |
| 3.0A | 330uA±20% | 10kΩ±20% | 4.7kΩ±20% |
耗电方的Rd的定义如下:$$Rd = 5.1kΩ±20%$$
| 供电电流能力 | Rd的电压值 |
|---|---|
| 900mA | 0.15~0.61V |
| 1.5A | 0.70~1.16V |
| 3.0A | 1.31~2.04V |
以上为固定的即默认的供电功率,其实根据PD协议,可以通过CC管脚的信号协商,实现更多的供电功率。
二、extcon驱动
extcon是External Connector的简称,用于抽象外部连接器,比如说Audio Jack、USB MicroB/TypeC接口等。
extcon驱动的主要功能是识别外部连接器状态变化,并将状态变化通知到与外部连接器相关的其他驱动。
使用extcon驱动,有什么好处呢?之前的内核都没有extcon驱动,又是怎么处理这些外部连接器的?不妨以USB驱动为例,看看使用extcon驱动前后的变化。
在extcon驱动出现之前,同一份USB控制器驱动代码,比较常见的做法就是在设备树中指明是哪种接口,USB控制器驱动代码中会解析设备树中的定义,通过if...else...来走不同的代码逻辑;
- 如果是
Micro-B接口,就注册VBUS和ID脚的中断、查询IO脚的电平状态; - 如果是
Type-C接口,就注册Type-C的中断,查询Type-C的状态;
假设后续又有新的接口出现,工作原理不同于已有的接口,那就又需要在USB控制器驱动中去增加相关代码。
在extcon驱动出现后,USB控制器驱动就能和外部接口驱动解耦。在USB控制器驱动看来,不管外部接口是什么,我只需知道外部接口状态的变化就好了,比如是否接入主机了、是否有设备接入了。
使用extcon驱动提供的函数接口来注册notifier,当外部接口状态变化时,extcon驱动负责回调notifier,USB控制器驱动代码无需再针对不同的外部接口改来改去。不同的外部接口,都用extcon来抽象自己的行为。
有关具体驱动的实现这里这里就不介绍了,具体可以参考:《extcon驱动及其在USB驱动中的应用》。
参考文章:
[1] 搞定DFP/UFP角色侦测设计USB 2.0 OTG升级Type-C
[3] USB_ID介绍

浙公网安备 33010602011771号