ここ1週間体調を崩していたので、全く進んでいません。 体調回復してきたので再開します。
前回作成したドライバはハードウェアの装着・削除を検出するだけの物でした。 ハードウェア側との通信だけしかしていなかったわけです。 ドライバはハードウェアとユーザーソフトウェアとの橋渡しの役目を果たしますから、ユーザー側とのI/Fを考えないといけません。
>> 続く
Bluetooth USBデバイスとの通信では、4種類の通信を扱います。 HCIコマンド、HCIイベント、ACLデータ、SCOデータです。
一方、USBにも4種類の通信方法があります。 Control, Interrupt, Bulk, Isochronousです。
これらのUSB通信方法の特性と、Bluetooth HCIで扱う通信の特性を考えて、HCI-USB仕様では以下の組合せで使うことが規定されています。 (HCI-USB仕様に関しては、後ほど解説記事をアップします)
HeadsetやHandsFreeなどの音声系プロファイルを開発するまでは、SCOデータは扱いません。 なので、まずはACLデータだけを扱うことを考えます。
単純にキャラクタデバイス型のドライバとして開発しようかと思います。 キャラクタデバイス型のドライバというのは、ファイルのようにopenして、writeやreadで読み書きして、closeで閉じるといった操作を行うタイプのドライバのことです。 ACLデータはwrite/readで操作し、HCIコマンドはioctrlで送るようにします。 HCIイベントは・・・シグナルを使おうかと思っています。
話は変わりますが、デバイスを装着したときに2回probeやdisconnectが呼ばれた件について、1つの仮説を考えました。 Bluetooth USBデバイスにはUSBインターフェースが2つ定義されています。 片方がACLデータのみ扱う用、もう一方がSCOデータ用です。 USBインターフェースは、例えば「スピーカー内蔵USBメモリ」みたいな、複数の機能を内蔵するデバイスで、それぞれの機能を分割するために用意されているものです。 つまり、それぞれのインターフェースごとに別々のドライバで制御できるようになっているわけです。 それで各インターフェースごとに呼び出されたのではないかと推測しています。
このエントリのトラックバックURL: http://bluetooth.k5-n.com/trackback.php?id=20070126175554286