MHI (调制解调器主机接口)¶
本文档提供有关 MHI 协议的信息。
概述¶
MHI 是高通创新中心公司 (Qualcomm Innovation Center, Inc.) 开发的协议。主机处理器使用它来通过高速外围总线或共享内存来控制调制解调器设备并与之通信。尽管 MHI 可以很容易地适应任何外围总线,但它主要与基于 PCIe 的设备一起使用。MHI 在物理总线上提供逻辑通道,并允许通过至少一个逻辑通道传输调制解调器协议,例如 IP 数据包、调制解调器控制消息和诊断信息。此外,MHI 协议还提供数据确认功能,并通过一个或多个逻辑通道管理调制解调器的电源状态。
MHI 内部结构¶
MMIO¶
MMIO(内存映射 I/O)由设备硬件中的一组寄存器组成,这些寄存器通过 PCIe 等外围总线映射到主机内存空间。以下是 MMIO 寄存器空间的主要组件
MHI 控制寄存器:访问 MHI 配置寄存器
MHI BHI 寄存器:BHI(引导主机接口)寄存器供主机在 MHI 初始化之前将固件下载到设备。
通道门铃数组:通道门铃 (DB) 寄存器供主机在有新工作要做时通知设备。
事件门铃数组:与事件上下文数组关联,事件门铃 (DB) 寄存器供主机在有新事件可用时通知设备。
调试寄存器:设备使用的一组寄存器和计数器,用于向主机公开调试信息,如性能、功能和稳定性。
数据结构¶
MHI 使用的所有数据结构都在主机系统内存中。设备使用物理接口访问这些数据结构。主机系统内存区域中的 MHI 数据结构和数据缓冲区被映射供设备使用。
通道上下文数组:所有通道配置都组织在通道上下文数据数组中。
传输环:主机使用它来为通道安排工作项。传输环组织为传输描述符 (TD) 的循环队列。
事件上下文数组:所有事件配置都组织在事件上下文数据数组中。
事件环:设备使用它向主机发送完成和状态转换消息
命令上下文数组:所有命令配置都组织在命令上下文数据数组中。
命令环:主机使用它向设备发送 MHI 命令。命令环组织为命令描述符 (CD) 的循环队列。
通道¶
MHI 通道是主机和设备之间的逻辑单向数据管道。MHI 中通道的概念类似于 USB 中的端点。MHI 最多支持 256 个通道。但是,特定的设备实现可能支持少于允许的最大通道数。
两个单向通道及其相关的传输环形成双向数据管道,上层协议可以使用该管道来传输应用程序数据包(例如 IP 数据包、调制解调器控制消息、诊断消息等)。每个通道都与单个传输环关联。
传输环¶
主机和设备之间的传输由通道组织,并由传输描述符 (TD) 定义。TD 通过传输环管理,传输环定义了设备和主机之间每个通道,并驻留在主机内存中。TD 由一个或多个环元素(或传输块)组成
[Read Pointer (RP)] ----------->[Ring Element] } TD
[Write Pointer (WP)]- [Ring Element]
- [Ring Element]
--------->[Ring Element]
[Ring Element]
以下是传输环的基本用法
主机为传输环分配内存。
主机在相应的通道上下文中设置基址指针、读指针和写指针。
当 RP == WP 时,环被视为空。
当 WP + 1 == RP 时,环被视为满。
RP 指示设备要处理的下一个元素。
当主机有新的缓冲区要发送时,它使用缓冲区信息更新环元素,将 WP 递增到下一个元素,并振铃关联的通道 DB。
事件环¶
从设备到主机的事件组织在事件环中,并由事件描述符 (ED) 定义。事件环供设备报告事件,例如数据传输完成状态、命令完成状态以及到主机的状态更改。事件环是驻留在主机内存中的 ED 数组。ED 由一个或多个环元素(或传输块)组成
[Read Pointer (RP)] ----------->[Ring Element] } ED
[Write Pointer (WP)]- [Ring Element]
- [Ring Element]
--------->[Ring Element]
[Ring Element]
以下是事件环的基本用法
主机为事件环分配内存。
主机在相应的通道上下文中设置基址指针、读指针和写指针。
主机和设备都有 RP、WP 的本地副本。
当 WP + 1 == RP 时,环被视为空(没有要处理的事件)。
当 RP == WP 时,环被视为充满事件。
当设备需要发送新事件时,设备将更新 RP 指向的 ED,将 RP 递增到下一个元素并触发中断。
环元素¶
环元素是一种数据结构,用于在主机和设备之间传输单个数据块。传输环元素类型包含单个缓冲区指针、缓冲区大小和其他控制信息。其他环元素类型可能只包含控制和状态信息。对于单缓冲区操作,环描述符由单个元素组成。对于大型多缓冲区操作(例如散布和收集),可以将元素链接在一起以形成更长的描述符。
MHI 操作¶
MHI 状态¶
MHI_STATE_RESET¶
上电或硬件重置后,MHI 处于复位状态。不允许主机访问设备 MMIO 寄存器空间。
MHI_STATE_READY¶
MHI 已准备好进行初始化。主机可以通过编程 MMIO 寄存器来启动 MHI 初始化。
MHI_STATE_M0¶
MHI 正在设备中运行和操作。主机可以通过发出通道启动命令来启动通道。
MHI_STATE_M1¶
MHI 操作被设备暂停。当设备在预设时间内检测到物理接口不活动时,会进入此状态。
MHI_STATE_M2¶
MHI 处于低功耗状态。MHI 操作被暂停,设备可能会进入较低功耗模式。
MHI_STATE_M3¶
MHI 操作被主机停止。当主机暂停 MHI 操作时,会进入此状态。
MHI 初始化¶
系统启动后,设备通过物理接口进行枚举。在 PCIe 的情况下,设备会被枚举并为设备的 MMIO 寄存器空间分配 BAR-0。为了在设备中初始化 MHI,主机执行以下操作
为事件、通道和命令数组分配 MHI 上下文。
初始化上下文数组并准备中断。
等待直到设备进入就绪状态。
编程 MHI MMIO 寄存器并将设备设置为 MHI_M0 状态。
等待设备进入 M0 状态。
MHI 数据传输¶
MHI 数据传输由主机启动,以将数据传输到设备。以下是主机执行的将数据传输到设备的操作顺序
主机使用缓冲区信息准备 TD。
主机递增相应通道传输环的 WP。
主机振铃通道 DB 寄存器。
设备唤醒以处理 TD。
设备通过更新 ED 为已处理的 TD 生成完成事件。
设备递增相应事件环的 RP。
设备触发 IRQ 以唤醒主机。
主机唤醒并检查事件环是否有完成事件。
主机更新相应事件环的 WP,以指示数据传输已成功完成。