MHI (Modem Host Interface)¶
本文档提供有关 MHI 协议的信息。
概述¶
MHI 是高通创新中心 (Qualcomm Innovation Center, Inc.) 开发的一种协议。主机处理器使用它通过高速外围总线或共享内存来控制调制解调器设备并与之通信。 尽管 MHI 可以很容易地适应任何外围总线,但它主要与基于 PCIe 的设备一起使用。 MHI 在物理总线上提供逻辑通道,并允许通过至少一个逻辑通道传输调制解调器协议,例如 IP 数据包、调制解调器控制消息和诊断信息。 此外,MHI 协议还提供数据确认功能,并通过一个或多个逻辑通道管理调制解调器的电源状态。
MHI 内部结构¶
MMIO¶
MMIO (内存映射 IO) 由设备硬件中的一组寄存器组成,这些寄存器通过 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 上下文。
初始化上下文数组,并准备中断。
等待设备进入 READY 状态。
编程 MHI MMIO 寄存器并将设备设置为 MHI_M0 状态。
等待设备进入 M0 状态。
MHI 数据传输¶
MHI 数据传输由主机启动,用于将数据传输到设备。 以下是主机执行的将数据传输到设备的操作顺序
主机准备带有缓冲区信息的 TD。
主机递增相应通道传输环的 WP。
主机响铃通道 DB 寄存器。
设备唤醒以处理 TD。
设备通过更新 ED 为已处理的 TD 生成完成事件。
设备递增相应事件环的 RP。
设备触发 IRQ 以唤醒主机。
主机唤醒并检查事件环以获取完成事件。
主机更新相应事件环的 WP 以指示数据传输已成功完成。