主機控制接口(HCI)是主機與控制器之間的接口,為二者規(guī)定了一種標準的通信機制。它允許主機將命令和數據發(fā)送到控制器,并允許控制器將事件和數據發(fā)送到主機。主機控制接口提供了基帶控制器和鏈路管理器的命令接口,以及對硬件配置參數的訪問接口。主機控制接口(HCI)并不是協(xié)議棧的一部分,但是它提供訪問藍牙硬件能力的統(tǒng)一接口方法。HCI固件通過訪問基帶命令、鏈路管理命令、硬件狀況注冊、控制注冊和事件注冊為藍牙硬件實現(xiàn)HCI命令。
基本介紹HCI層為主機和控制器之間的通信提供了一種標準化的接口,其主要完成兩個任務:發(fā)送命令給控制器和接收來自控制器的事件;發(fā)送和接收來自對端設備的數據1。
在低功耗藍牙規(guī)范中定義了4種物理接口方式:
●UART異步通信接口提供最簡單方式;
●3線UART接口提供可靠的通信方式; -
●USB通用的高速傳輸方式;
●用于消費電子設備的SDIO安全數字輸入輸出。
1.UART異步通信接口
●RS232設置數據位:8;效驗位:無;停止位:1;流控制:RTS/CTS;
●波特率:由制造商制定;
●流控制響應時間:由制造商制定;
●配置為零調制解調器。
每個HCI數據包分別有不同的類型,包的編碼將是以下類型中的一種:
命令(Command)=0x01,
數據(Data)=0x02,
事件(Event)=0x04。
該接口不適合在低電壓的情況下進行數據的收發(fā)。
2. 3線UART接口
●增加幀以檢測UART位錯誤;
●允許在產品上使用較長的UART線;
●當UART電纜受干擾時仍可理想的使用;
●支持自動波特率檢測;
●支持低功耗;
●具備軟件流控制。
3. USB接口
低功耗藍牙規(guī)范也提供了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來實現(xiàn)
在SOC單芯片的低功耗藍牙芯片中,可以由通過軟件API庫的方式來實現(xiàn)1。
命令和事件概覽主機控制接口通過包的方式來傳送數據、命令和事件,所有在主機和控制器之間的通信都以包的形式進行。每個命令的返回參數都通過特定的事件包來傳輸。主機控制接口有數據、命令和事件三種包,其中:數據包是雙向的;命令包只能從主機發(fā)往主機控制器;事件包始終是主機控制器發(fā)向主機的。主機發(fā)出的大多數命令包都會觸發(fā)主機控制器產生相應的事件包作為響應。命令包有6種類型,事件包有3種類型,它們按照功能等級分在了管理等級、測試、通用事件3個不同的邏輯組中。
管理等級管理等級包括控制層的配置、設備發(fā)現(xiàn)、鏈路層鏈接管理、安全管理等。
1.控制層的配置
在控制器與對端設備通信前,主機通過控制層的配置命令重新設置和配置控制層。屬于這個功能組的命令為復位命令、讀緩沖區(qū)大小命令、讀公有設備地址命令、設置私有設備地址命令、讀空濾波器數量命令、寫默認的濾波器策略命令、將設備添加到設備地址白名單命令、清除白名單上的設備地址命令、寫控制層活動模式命令、刷新命令、設置事件屏蔽命令。
2.設備發(fā)現(xiàn)
設備發(fā)現(xiàn)命令和事件控制廣播和掃描功能,并且將掃描結果傳送給主機層。屬于這個功能組的命令和事件為寫廣播模式命令、設置廣播參數命令、設置廣播信道命令、設置設備名稱命令、設置掃描響應參數命令、寫廣播數據命令、被完成的廣播服務事件、設置初始的隨機向量命令、寫掃描模式命令、設置掃描參數命令、廣播包報告事件、掃描響應報告事件。
3.鏈路層鏈接管理
鏈路層鏈接管理命令和事件允許一個設備產生與另一個設備的鏈路層的鏈接并且管理這個鏈接。屬于這個功能組的命令和事件為創(chuàng)建鏈路層鏈接命令、停止創(chuàng)建鏈路層鏈接命令、遠程鏈路層鏈接請求事件、鏈路層鏈接被創(chuàng)建的事件、終止鏈路層鏈接命令、鏈路層鏈接終止事件、更新鏈路層鏈接參數命令、鏈路層鏈接參數更新完成事件、更新信道映射命令、信道映射更新完成事件、已完成的分組數量事件。
4.安全管理
控制層安全管理命令和事件允許隱私和安全管理。屬于這個功能組的命令和事件為設置密鑰命令、設置IV命令、加密命令、隨機數命令、配置加密命令、加密配置請求事件、加密配置完成事件。
測試當器件被封裝到模塊或者產品中后,就無法像剛被生產出來時那樣,拋開主機協(xié)議棧花幾秒鐘就完成器件測試。通過定義標準測試流程和硬件接口,直接測試模式可以解決上述問題。而單獨測試未被集成在高度優(yōu)化的模塊或最終產品的控制器時,可以通過復用已有的主機控制接口傳輸層和邏輯接口訪問控制器。當使用主機控制接口進行測試時,相關的命令與事件有復位、低功耗發(fā)射機測試、低功耗接收機測試、低功耗測試結束、命令完成。
通用事件通用事件用來傳遞關于命令狀態(tài)的信息以及硬件出錯信息。屬于這個功能組的事件為命令完成事件、命令狀態(tài)事件、硬件出錯事件2。
主機控制接口的流控制在主機到控制層的方向上,流控制可以避免造成控制層緩沖區(qū)的溢出。主機控制接口接口有命令流控和數據流控兩種形式??刂破魇褂妹盍骺赝瑫r處理多個主機控制接口命令。主機可以通過控制器來獲知緩沖區(qū)的長度,從而得知可以同時發(fā)送的命令的最大數量。要啟動命令流控,命令完成事件和命令狀態(tài)事件都必須包含一個Num HCI Command Packets參數表示控制器能緩存多少命令,還會在其中包含緩沖區(qū)的剩余空間。
數據流控與命令流控差不多。每次控制器都從一個緩沖區(qū)提取數據包來發(fā)送給對端設備,一旦數據包發(fā)送成功,控制器釋放該緩沖區(qū),以便裝填主機發(fā)送給控制器的新數據包。主機通過命令LE Read Buffer Size獲知緩沖區(qū)的剩余數量,控制器發(fā)送Number Of CompletedPackets事件給主機,使其知道釋放了多少個緩沖區(qū)及哪些數據發(fā)送到了對端設備。基于控制層緩沖區(qū)狀態(tài)的信息,主機會決定是否向控制層提交新的命令與數據,或者是否等待。
在控制層到主機方向上,沒有直接的流控制。主機控制接口不支持事件流控,因為事件的數量受限于可處理命令的數量,并且主機比控制器有更多資源能夠順序地緩沖和處理這些事件??刂破鞯街鳈C的數據流控可以忽略,因為大部分主機都能處理從控制器到主機的大量數據,沒有必要進行流控。
如有必要,主機控制接口的流量控制可由主機控制器來實現(xiàn)對主機的控制,可以通過Set_Host_Controller**_**To_Host_Flow_Control命令設置,其控制過程基本與主機控制過程類似,只是命令稍有不同。當主機收到斷鏈確認的事件后,就認為所有傳往主機控制器的數據包已經全部被丟棄了,主機控制器中的數據緩沖區(qū)也被釋放了2。
主機控制接口的數據格式數據和參數格式除非特別說明,所有的數值都是以小尾格式(Little Endian碼)存儲。當指定值的時候,可以有負數值的所有參數必須使用2的補碼。數組化的參數被指定使用下面的標記法:參數A[i]。如果有多于一套數組化的參數被指定(如參數A[i],參數B[i]),那么參數的順序應該是下面的形式:參數A[0],參數B[o],參數A[1],參數B[1],……,參數A[n],參數B[n]。
除非特別指明,所有參數的值都以小尾格式(Little Endian碼)發(fā)送和接收。在一個位串中,右邊的數據位是低位數據位。例如,對于二進制“10”來說,0就是低位數據位。除了明確說明以外,標記為被保留未來使用(Reserved for Future Use,RFU)的數值和參數應該設置為0,并且在接收時忽略。
主機控制接口命令分組主機控制接口命令分組用來將命令從主機發(fā)送到控制層。主機控制接口命令分組的格式如圖1所示。
每一個命令會分配2B的標識符(OpCode),這個標識符用來唯一確定命令的不同類型。OpCode分為2個不同的域,分別稱為OpCode組域(OGF)和OpCode命令域(OCF)。OGF占OpCode的高6b,在低功耗藍牙命令中設置為0x07。OCF占據OpCode的剩余的10b,并且它決定了低功耗藍牙的主機控制接口命令。在OpCode后面是占據1B的參數總長度域,這個參數表明了在命令中所有參數的長度,這個長度是以8b為單位的。每一個命令都會有許多參數。這些參數和參數的大小都是為每一個命令定義的。每一個參數的長度都是8b的整數倍。
主機控制接口數據分組主機控制接口數據分組用來將數據在主機和控制層之間進行交換。主機控制接口數據分組的格式如圖2所示。
這個數據分組的前12b(鏈接ID)確定了包所屬的鏈路層的鏈接。當一個新的鏈接被創(chuàng)建并且具有0x000~0xFFF之間的數值時,鏈接ID由控制層所分配。在0xF00~0xFFF之間的數值是被保留的。PB設置為00,BC設置為00。之后的16b(數據總長度)表明了包中數據的總長度,
這個長度是以8b為單位的。數據域以升序字節(jié)順序排序。
主機控制接口事件分組當事件發(fā)生時,主機控制接口事件包被控制層用來向主機做出通知。主機控制接口事件分組的格式如圖3所示。
每一個事件分配1B的事件標識符(事件碼)。這個事件碼用來唯一確定事件的不同類型。事件碼是主機控制接口事件分組的第一個字節(jié)。包的第二個字節(jié)包含了數據總長度域,表明了在包中的所有參數的長度,這個長度是以8b為單位的。每一個事件都有許多參數。這些參數和參數的大小都是為每一個事件定義的。每一個參數的長度都是8b的整數倍2。
本詞條內容貢獻者為:
孔祥杰 - 副教授 - 大連理工大學軟件學院