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 以指示資料傳輸已成功完成。