在USB On-The-Go(OTG)架构中,HNP(Host Negotiation Protocol,主机协商协议)和SRP(Session Request Protocol,会话请求协议)是实现设备动态切换主机与从设备角色的关键协议。而ID引脚作为USB OTG接口的重要组成部分,承担着硬件层面角色判定的职责。要实现HNP和SRP协议的功能,硬件和软件必须紧密协同工作。以下将从硬件和软件两个层面详细解释HNP和SRP协议如何依赖于ID引脚,以及内核如何配置双角色切换并与硬件交互。
---
1. USB-OTG的ID引脚
1.1 ID引脚的功能
- 角色判定:
- ID引脚接地(GND):设备通常被配置为主机(Host)模式。
- ID引脚悬空(未连接):设备通常被配置为从设备(Peripheral)模式。
1.2 ID引脚的控制方式
- 硬件控制:
- 跳线帽:通过外部跳线帽连接或断开ID引脚,实现设备角色的固定切换。这是一种静态配置,角色固定不变,除非手动调整跳线帽。
- 电平转换电路:某些设计中,ID引脚的电平状态由专用的电平转换电路控制,允许更灵活的角色管理。
- GPIO控制:高级设计中,CPU可以通过GPIO(通用输入输出)端口动态控制ID引脚,实现软件层面的角色切换。
- 软件控制:
- 动态角色切换:通过GPIO或其他控制手段,软件可以在运行时改变ID引脚状态,从而实现动态的角色切换。
---
2. HNP和SRP协议简介
2.1 Session Request Protocol (SRP) - 会话请求协议
- 定义与功能:
- SRP允许从设备在没有外部主机的情况下主动发起会话请求,启动主机模式。
- 工作流程:
- 会话请求:从设备通过拉高VBUS电压(通常通过控制ID引脚)向主设备发送会话请求信号。
- 主设备响应:主设备检测到SRP信号后,提供电源并切换到主机模式,建立通信会话。
2.2 Host Negotiation Protocol (HNP) - 主机协商协议
- 定义与功能:
- HNP允许已经建立连接的双角色设备在主机和从设备之间动态切换角色。
- 工作流程:
- 初始连接:设备A作为主机,设备B作为从设备建立初始连接。
- 角色切换请求:设备B需要切换为主机时,通过HNP向设备A发起角色切换请求。
- 协商与切换:设备A同意后,设备A切换为从设备,设备B切换为主机,双方角色互换。
---
3. HNP和SRP协议与ID引脚的关系
3.1 硬件层面:ID引脚的电平状态
- 初始角色确定:
- 跳线帽固定:通过硬件跳线帽将ID引脚接地或悬空,固定设备为主机或从设备。
- 动态控制:通过GPIO等方式,软件可以动态控制ID引脚状态,实现角色的切换。
- 与协议的关联:
- 固定角色:如果通过跳线帽固定了主机和从设备角色,通常无需HNP/SRP协议进行动态切换。
- 动态角色:如果设备支持并启用HNP/SRP协议,ID引脚的状态可以通过协议协商动态变化,实现角色切换。
3.2 协议层面:HNP/SRP对ID引脚的影响
- SRP与ID引脚:
- 会话启动:当从设备通过SRP协议发起会话请求时,硬件需要通过拉高VBUS(控制ID引脚)来切换为主机模式。
- 电平控制:SRP的实现通常需要软件通过GPIO等手段控制ID引脚的电平状态,从而物理上实现角色切换。
- HNP与ID引脚:
- 角色切换:通过HNP协议,设备需要在已建立连接后动态切换角色,这需要软件层面协调硬件(ID引脚)的状态变化。
- 协商过程:HNP协商成功后,软件需要控制ID引脚切换角色,同时USB控制器相应地调整其工作模式。
---
4. 软件与硬件的协同工作机制
4.1 内核配置双角色切换
- 驱动支持:
- Dual-Role USB驱动:内核中需要启用支持双角色(Dual-Role)的USB驱动,如Linux内核中的DWC2驱动。
- 设备树(Device Tree)配置:
- 角色模式设置:通过设备树文件中的dr_mode属性,指定USB控制器的初始角色模式(host、peripheral、otg)。
usb_otg {
compatible = "generic,usb-otg";
dr_mode = "otg"; // 支持双角色模式
// 其他配置项
};
- GPIO控制:
- ID引脚的GPIO映射:设备树中需要配置GPIO控制ID引脚,通常通过gpio节点指定。
usb_otg {
compatible = "generic,usb-otg";
dr_mode = "otg";
gpio_id = <&gpio 5 0>; // 假设ID引脚连接到GPIO5
// 其他配置项
};
4.2 内核与硬件的交互
- 角色切换的触发:
- 协议层触发:当HNP/SRP协议需要切换角色时,驱动层通过API调用控制GPIO,以改变ID引脚的电平状态。
- GPIO驱动:内核中的GPIO驱动负责将软件层的命令转换为硬件电平信号,实际控制ID引脚的状态。
- USB控制器的响应:
- 物理模式切换:USB控制器根据ID引脚的电平状态切换其工作模式(主机或从设备)。
- 协议处理:切换后的模式将影响USB协议栈的行为,如重新初始化USB总线、重新分配资源等。
4.3 HNP和SRP协议的实现
- 驱动支持:
- USB Gadget/UCSI:内核中的USB Gadget子系统或UCSI(USB Type-C Connector System Software Interface)模块实现了HNP和SRP协议的逻辑。
- 角色协商流程:
- HNP触发:设备通过协议要求切换角色,驱动层调用GPIO驱动改变ID引脚电平。
- 硬件响应:USB控制器检测到ID引脚电平变化,切换工作模式。
- 协议处理:切换后的协议栈重新初始化,确保新角色下的通信正常。
---
5. 芯片支持HNP和SRP协议的具体体现
5.1 硬件支持
- USB控制器具备双角色能力:
- 如DesignWare USB2 DRD Core支持Dual-Role模式,能够根据ID引脚状态灵活切换主从角色。
- ID引脚电平检测与控制:
- 芯片内部具备对ID引脚电平状态的检测逻辑,并通过内置电路或外部GPIO驱动实现电平控制。
5.2 软件支持
- 驱动程序实现:
- 驱动程序包含HNP和SRP协议的实现逻辑,能够根据协议要求调用GPIO控制ID引脚。
- 协议栈集成:
- USB协议栈集成了对HNP和SRP协议的支持,能够处理协议协商的各个步骤,如请求角色切换、确认切换等。
- 固件协同:
- 某些芯片可能需要特定的固件支持,以实现更高效或更稳定的HNP/SRP协议处理。
---
6. 具体实现流程
6.1 初始化阶段
- 启动设备:
- 内核加载USB驱动,读取设备树配置,初始化USB控制器。
- 角色判定:
- 根据ID引脚的电平状态(由跳线帽或GPIO控制),USB控制器初始化为主机或从设备模式。
6.2 SRP会话启动
- 从设备发起SRP:
- 从设备需要启动会话,通过驱动层调用GPIO改变ID引脚状态,拉高VBUS电压。
- 主设备响应:
- 主设备检测到VBUS电压变化,切换为主机模式,建立通信会话。
6.3 HNP角色切换
- 发起切换请求:
- 当前主设备需要切换为从设备,通过HNP协议向从设备发起角色切换请求。
- 协商与切换:
- 驱动层通过GPIO改变ID引脚状态,从设备检测到请求,同意后切换为主机角色,原主设备切换为从设备模式。
- 完成切换:
- 双方完成角色切换,新的主机和从设备角色生效,通信按新角色进行。
---
7. 总结与关键点
- ID引脚的硬件角色判定:
- ID引脚的电平状态通过硬件(跳线帽、GPIO)控制,决定设备的主机或从设备角色。
- HNP和SRP协议的依赖:
- HNP和SRP协议需要硬件支持ID引脚的电平控制,通过软件驱动层实现协议逻辑与硬件控制的协同。
- 内核配置与驱动实现:
- 内核通过设备树配置USB控制器的双角色能力,驱动程序实现协议逻辑并控制ID引脚,实现软件与硬件的互动。
- 双角色切换的实现:
- 通过HNP和SRP协议,设备在通信过程中可以动态切换角色,驱动通过控制ID引脚实现硬件层面的切换,保证协议层面的协商顺利进行。
- 芯片支持的具体体现:
- 芯片通过内置的USB控制器、ID引脚电平检测与控制逻辑,与驱动程序的协议实现协同工作,支持HNP和SRP协议的功能。
通过以上综合解释,可以看出,HNP和SRP协议的实现不仅依赖于软件协议栈的逻辑处理,还需要硬件层面对ID引脚的准确控制与检测。内核中的双角色驱动通过设备树配置和GPIO控制,实现了软件与硬件的紧密结合,从而支持HNP和SRP协议,确保USB-OTG设备能够在主机与从设备角色之间灵活切换,实现稳定的网络通信。