HCI (Bluetooth)
読み:エイチスィーアイ
外語:HCI: Host Controller Interface
Bluetooth
において、コントローラーとホストの間で使われる
通信プロトコル
。
目次
概要
特徴
種類
コマンドとイベント
トランスポート層
HCI UARTトランスポートレイヤー
HCI USBトランスポートレイヤー
フレームの構造
0x01 HCIコマンド
0x02 ACLデータ
0x03 SCOデータ
0x04 HCIイベント
概要
Bluetoothモジュールを制御したり、データを無線で送受信するために使う、一番最下層のインターフェイスである。
有線でも例えば
Ethernet
ならEthernetコントローラーICなどを使い、その上にEthernetのプロトコルから上を実装することになるが、Bluetoothのような無線でも同様にハードウェアとソフトウェアの分担があり、その境界となるのがHCIである。
HCIで使用する物理層は、Bluetoothチップとホストの都合に合わせて選択されるため、様々なものがある。
UART
、
USB
などが使われることが多いようで、規格上このレイヤーをHCI Transportレイヤーという。UARTの場合、速度は実装依存だが、いわゆるRS-232Cで、データ長8ビット・ストップビット1ビット・パリティチェックなしの「N81」で、フロー制御は
S制御
というのが一般的のようである。
数値データは
リトルエンディアン
で表現されている。
特徴
種類
フレームは4種類存在する。
HCIコマンド (コントローラー制御用)
HCIイベント (コントローラー制御用)
ACLデータ (非同期通信、
L2CAP
パケット用)
SCOデータ (同期通信、音声通信用)
コマンドとイベント
ホストがBluetoothを使うためには、Bluetoothコントローラーに対してHCIコマンドを発行する。
コントローラーは順次コマンドを実行するが、同時に複数のコマンドを実行でき、さらにコマンドの処理時間はコマンドごとに違う。したがって、コマンドを送った順に処理が完了するわけではない。
そこで、コマンドの終了通知はイベントとして発行される。
トランスポート層
HCI UARTトランスポートレイヤー
UARTの場合、フレームの種類を表わすオクテットがあり、続いて実際のデータがある。
HCI packet indicator (8ビット)
HCI packet (任意長)
indicatorは、フレームの種類(4種類)に応じて、次のように定義されている。
0x01 ‐ HCIコマンド
0x02 ‐ ACLデータ
0x03 ‐ SCOデータ
0x04 ‐ HCIイベント
HCI packet部の詳細なフォーマットは後述されるが、例えばコマンドをモジュールに送る時は、まず0x01をUARTに送り、次いで16ビットのOpcodeを送り、さらにLength、そしてParameter、という形式になる。
HCI USBトランスポートレイヤー
USBの場合、フレームの種類はエンドポイントアドレスで表わす。
エンドポイントアドレスは、フレームの種類に応じて、次のように定義されている。
0x00 ‐ HCIコマンド
0x81 ‐ HCIイベント
0x82/0x02 ‐ ACLデータ
ACLデータは、USBのバルク転送に対応する。また他に、0x83/0x03を使う
アイソクロナス転送
も定義されている。
フレームの構造
0x01 HCIコマンド
OpCode (16ビット)
OCF(OpCode Command Field) (10ビット)
OGF(OpCode Group Field) (6ビット)
Length (8ビット) Parameters部の長さ(バイト単位)
Parameters (最大255バイト)
0x02 ACLデータ
Connection Handle (12ビット) 各接続ごとに持っている12ビットのユニークな値
Flags (4ビット)
PB (Packet Boundary Flag) L2CAPパケットの分割を示す2ビットの値
00 : 予約
01 : 分割されたL2CAPパケットの続き
10 : (分割の有無を問わない)L2CAPパケットの最初のフラグメント
11 : 予約
BC (Broadcast Flag) ブロードキャストかどうかを示す2ビットの値 (ホストとコントローラーの方向により若干意味が変わる)
ホスト→コントローラーの場合
00 : Point-to-Point、ブロードキャストではない
01 : Actice Slave Broadcast
10 : Parked Slave Broadcast
11 : 予約
コントローラー→ホストの場合
00 : Point-to-Point
01 : パーク状態ではないスレーブ
10 : パーク状態のスレーブ (Parked Slave Broadcast)
11 : 予約
Length (16ビット) Data部の長さ(バイト)
Data
0x03 SCOデータ
Connection Handle (12ビット) 各接続ごとに持っている12ビットのユニークな値
(Resv) (4ビット)
Length (8ビット) Data部の長さ(バイト)
0x04 HCIイベント
Event Code (8ビット) 0xFFはベンダー固有のデバッグイベント用、0xFEはBluetoothロゴテスト用として予約されている
Length (8ビット) Parameters部の長さ(バイト)
Parameters (最大255バイト)
再検索