主機控制接口

主機控制接口

主機控制接口(HCI)是主機與控制器之間的接口,為二者規定了一種標準的通信機制。它允許主機將命令和數據傳送到控制器,並允許控制器將事件和數據傳送到主機。主機控制接口提供了基帶控制器和鏈路管理器的命令接口,以及對硬體配置參數的訪問接口。主機控制接口(HCI)並不是協定棧的一部分,但是它提供訪問藍牙硬體能力的統一接口方法。HCI固件通過訪問基帶命令、鏈路管理命令、硬體狀況註冊、控制註冊和事件註冊為藍牙硬體實現HCI命令。

基本介紹

  • 中文名:主機控制接口
  • 外文名:HostControllerInterface
  • 簡寫:HCI
  • 簡介:主機與控制器之間的接口
基本介紹,命令和事件概覽,管理等級,測試,通用事件,主機控制接口的流控制,主機控制接口的數據格式,數據和參數格式,主機控制接口命令分組,主機控制接口數據分組,主機控制接口事件分組,

基本介紹

HCI層為主機和控制器之間的通信提供了一種標準化的接口,其主要完成兩個任務:傳送命令給控制器和接收來自控制器的事件;傳送和接收來自對端設備的數據。
在低功耗藍牙規範中定義了4種物理接口方式:
UART異步通信接口提供最簡單方式;
●3線UART接口提供可靠的通信方式; -
●USB通用的高速傳輸方式;
●用於消費電子設備的SDIO安全數字輸入輸出。
1.UART異步通信接口
●RS232設定數據位:8;效驗位:無;停止位:1;流控制:RTS/CTS;
●波特率:由製造商制定;
●流控制回響時間:由製造商制定;
●配置為零數據機
每個HCI數據包分別有不同的類型,包的編碼將是以下類型中的一種:
命令(Command)=0x01,
數據(Data)=0x02,
事件(Event)=0x04。
該接口不適合在低電壓的情況下進行數據的收發。
2. 3線UART接口
●增加幀以檢測UART位錯誤;
●允許在產品上使用較長的UART線;
●當UART電纜受干擾時仍可理想的使用;
●支持自動波特率檢測;
●支持低功耗;
●具備軟體流控制。
低功耗藍牙規範也提供了USB方式的HCI接口,為ACL數據包定義了一個端點:端點(out) 0x02/(in)0x82,建議的數據包長度是32或64。命令使用控制端點,事件使用中斷端點(in)0x81,間隔為1 ms。
4. SDIO接口
SDIO是一種高速傳輸接口,主機可以通過SDIO卡的類型A接口與控制器通信。使用與UART相同的數據包編碼。
命令(Command)=0x01,
數據(Data)=0x02,
事件(Event)=0x04。
5.通過軟體API來實現
在SOC單晶片的低功耗藍牙晶片中,可以由通過軟體API庫的方式來實現。

命令和事件概覽

主機控制接口通過包的方式來傳送數據、命令和事件,所有在主機和控制器之間的通信都以包的形式進行。每個命令的返回參數都通過特定的事件包來傳輸。主機控制接口有數據命令事件三種包,其中:數據包是雙向的;命令包只能從主機發往主機控制器;事件包始終是主機控制器發向主機的。主機發出的大多數命令包都會觸發主機控制器產生相應的事件包作為回響。命令包有6種類型,事件包有3種類型,它們按照功能等級分在了管理等級、測試、通用事件3個不同的邏輯組中。

管理等級

管理等級包括控制層的配置、設備發現、鏈路層連結管理、安全管理等。
1.控制層的配置
在控制器與對端設備通信前,主機通過控制層的配置命令重新設定和配置控制層。屬於這個功能組的命令為復位命令、讀緩衝區大小命令、讀公有設備地址命令、設定私有設備地址命令、讀空濾波器數量命令、寫默認的濾波器策略命令、將設備添加到設備地址白名單命令、清除白名單上的設備地址命令、寫控制層活動模式命令、刷新命令、設定事件禁止命令。
2.設備發現
設備發現命令和事件控制廣播和掃描功能,並且將掃描結果傳送給主機層。屬於這個功能組的命令和事件為寫廣播模式命令、設定廣播參數命令、設定廣播信道命令、設定設備名稱命令、設定掃描回響參數命令、寫廣播數據命令、被完成的廣播服務事件、設定初始的隨機向量命令、寫掃描模式命令、設定掃描參數命令、廣播包報告事件、掃描回響報告事件。
3.鏈路層連結管理
鏈路層連結管理命令和事件允許一個設備產生與另一個設備的鏈路層的連結並且管理這個連結。屬於這個功能組的命令和事件為創建鏈路層連結命令、停止創建鏈路層連結命令、遠程鏈路層連結請求事件、鏈路層連結被創建的事件、終止鏈路層連結命令、鏈路層連結終止事件、更新鏈路層連結參數命令、鏈路層連結參數更新完成事件、更新信道映射命令、信道映射更新完成事件、已完成的分組數量事件。
4.安全管理
控制層安全管理命令和事件允許隱私和安全管理。屬於這個功能組的命令和事件為設定密鑰命令、設定IV命令、加密命令、隨機數命令、配置加密命令、加密配置請求事件、加密配置完成事件。

測試

當器件被封裝到模組或者產品中後,就無法像剛被生產出來時那樣,拋開主機協定棧花幾秒鐘就完成器件測試。通過定義標準測試流程和硬體接口,直接測試模式可以解決上述問題。而單獨測試未被集成在高度最佳化的模組或最終產品的控制器時,可以通過復用已有的主機控制接口傳輸層和邏輯接口訪問控制器。當使用主機控制接口進行測試時,相關的命令與事件有復位、低功耗發射機測試、低功耗接收機測試、低功耗測試結束、命令完成。

通用事件

通用事件用來傳遞關於命令狀態的信息以及硬體出錯信息。屬於這個功能組的事件為命令完成事件、命令狀態事件、硬體出錯事件。

主機控制接口的流控制

在主機到控制層的方向上,流控制可以避免造成控制層緩衝區的溢出。主機控制接口接口有命令流控數據流控兩種形式。控制器使用命令流控同時處理多個主機控制接口命令。主機可以通過控制器來獲知緩衝區的長度,從而得知可以同時傳送的命令的最大數量。要啟動命令流控,命令完成事件和命令狀態事件都必須包含一個Num HCI Command Packets參數表示控制器能快取多少命令,還會在其中包含緩衝區的剩餘空間。
數據流控與命令流控差不多。每次控制器都從一個緩衝區提取數據包來傳送給對端設備,一旦數據包傳送成功,控制器釋放該緩衝區,以便裝填主機傳送給控制器的新數據包。主機通過命令LE Read Buffer Size獲知緩衝區的剩餘數量,控制器傳送Number Of CompletedPackets事件給主機,使其知道釋放了多少個緩衝區及哪些數據傳送到了對端設備。基於控制層緩衝區狀態的信息,主機會決定是否向控制層提交新的命令與數據,或者是否等待。
在控制層到主機方向上,沒有直接的流控制。主機控制接口不支持事件流控,因為事件的數量受限於可處理命令的數量,並且主機比控制器有更多資源能夠順序地緩衝和處理這些事件。控制器到主機的數據流控可以忽略,因為大部分主機都能處理從控制器到主機的大量數據,沒有必要進行流控。
如有必要,主機控制接口的流量控制可由主機控制器來實現對主機的控制,可以通過Set_Host_Controller_To_Host_Flow_Control命令設定,其控制過程基本與主機控制過程類似,只是命令稍有不同。當主機收到斷鏈確認的事件後,就認為所有傳往主機控制器的數據包已經全部被丟棄了,主機控制器中的數據緩衝區也被釋放了。

主機控制接口的數據格式

數據和參數格式

除非特別說明,所有的數值都是以小尾格式(Little Endian碼)存儲。當指定值的時候,可以有負數值的所有參數必須使用2的補碼。數組化的參數被指定使用下面的標記法:參數A[i]。如果有多於一套數組化的參數被指定(如參數A[i],參數B[i]),那么參數的順序應該是下面的形式:參數A[0],參數B[o],參數A[1],參數B[1],……,參數A[n],參數B[n]。
除非特別指明,所有參數的值都以小尾格式(Little Endian碼)傳送和接收。在一個位串中,右邊的數據位是低位數據位。例如,對於二進制“10”來說,0就是低位數據位。除了明確說明以外,標記為被保留未來使用(Reserved for Future Use,RFU)的數值和參數應該設定為0,並且在接收時忽略。

主機控制接口命令分組

主機控制接口命令分組用來將命令從主機傳送到控制層。主機控制接口命令分組的格式如圖1所示。
主機控制接口
圖1 主機控制接口命令分組
每一個命令會分配2B的標識符(OpCode),這個標識符用來唯一確定命令的不同類型。OpCode分為2個不同的域,分別稱為OpCode組域(OGF)和OpCode命令域(OCF)。OGF占OpCode的高6b,在低功耗藍牙命令中設定為0x07。OCF占據OpCode的剩餘的10b,並且它決定了低功耗藍牙的主機控制接口命令。在OpCode後面是占據1B的參數總長度域,這個參數表明了在命令中所有參數的長度,這個長度是以8b為單位的。每一個命令都會有許多參數。這些參數和參數的大小都是為每一個命令定義的。每一個參數的長度都是8b的整數倍。

主機控制接口數據分組

主機控制接口數據分組用來將數據在主機和控制層之間進行交換。主機控制接口數據分組的格式如圖2所示。
主機控制接口
圖2 主機控制接口數據分組的格式
這個數據分組的前12b(連結ID)確定了包所屬的鏈路層的連結。當一個新的連結被創建並且具有0x000~0xFFF之間的數值時,連結ID由控制層所分配。在0xF00~0xFFF之間的數值是被保留的。PB設定為00,BC設定為00。之後的16b(數據總長度)表明了包中數據的總長度,
這個長度是以8b為單位的。數據域以升序位元組順序排序。

主機控制接口事件分組

當事件發生時,主機控制接口事件包被控制層用來向主機做出通知。主機控制接口事件分組的格式如圖3所示。
主機控制接口
圖3 主機控制接口事件分組
每一個事件分配1B的事件標識符(事件碼)。這個事件碼用來唯一確定事件的不同類型。事件碼是主機控制接口事件分組的第一個位元組。包的第二個位元組包含了數據總長度域,表明了在包中的所有參數的長度,這個長度是以8b為單位的。每一個事件都有許多參數。這些參數和參數的大小都是為每一個事件定義的。每一個參數的長度都是8b的整數倍。

相關詞條

熱門詞條

聯絡我們