Linuxとbluetooth

Prime MusicがAmazonから提供されるようになったので意味もなく
ブルースとかレゲエとかヘヴィメタルとか聴いてます

閑話休題

ブルースではなくbluezです
私のラップトップはThinkPad Edge E145なのですが,これのwifiが
Broadcomの43228 + 20702A1 comboです.
43228(pci)のほうは,Linuxカーネルのリバースエンジニアリングドライバ(メインライン)なりプロプライエタリのwlドライバなりが存在します.
なので,無線LANには困りません.
もう片方,207021A(vid:0a5c, pid:21f3)のほうが問題でした.
btusbドライバがカーネルにはあるので,ちゃんとデバイスは読めるのですが,
バイナリブロブ(ファームウェア)は存在しません.
なので,このbluetoothインターフェイスは使えませんでした.


しかし,これの解決方法を知ったので以下に

1. 公式のWindowsドライバをDownload

ThinkPadならば,普通に公式サイトからダウンロードしてください
他のマシンでも同様です.
または,http://catalog.update.microsoft.com/v7/site/ScopedViewRedirect.aspx?updateid=87a7756f-1451-45da-ba8a-55f8aa29dfee
から.cabのパッケージをダウンロードする手もあります

2. 解凍

普通にexeをダウンロードしたらならば,wineかWindowsで起動して中身を取り出します
setupに必要なファイル群が解凍されたらsetupそのものは実行しないようにすれば良いです
cabをダウンロードしたならばcabextractコマンドをインストールして使いましょう

3. インストール

まず,lsusbコマンドで自分のマシンのbroadcomなbluetoothデバイスのIDを控えましょう
ID 0a5c:21f3となっていれば,0a5cがvid(ベンダーID)で21f3がpid(製品ID)です

解凍先のWin32とかWin64とかのディレクトリをを見にいきましょう(32か64はどっちでも良いです).
cabextractでcabから取り出したならばならコマンドを実行したディレクトリにファイル群が展開されます.
*.hexというファイルが,Windowsのbroadcomなbluetoothドライバファームウェアです.*.hexは大量にあるので,まず,
bcbtums-win8x64-brcm.inf
とかそんな感じのファイルを探して,開きます.

このファイルをlessとかで開いて,先に控えたpidで検索します.
おそらく,
%BRCM20702A1.DeviceDesc=%BlueRAMUSB21F3, USB\VID_0A5C&PID_21F3 ...
みたいな行がまず見つかります.
この行の一番右の列に自分のマシンの名前(たとえばこのThinkPad Edge E145なら,Lenovo Edge 43228 + 20702A1 comoboとありました)があるでしょうか?

それが確認できたら次は,BlueRAMUSB21F3 というinfのセクションを検索します.
すると,そのセクションの中に,*.hexのファイル名が書いてあるのを見つける事ができるかと思います.

たとえば43228 + 20702A1 comoboならばBCM20702A1_001.002.014.1443.1448.hexです

最後に,bluez-utilsに入っているhex2hcdコマンドをつかって,
$ hex2hcd BCM20702A1_001.002.014.1443.1448.hex
# mv BCM20702A1_001.002.014.1443.1448.hcd /usr/lib/firmware/brcm/BCM2070A1-0a5c-21f3.hcd
としてください.これで,rebootするかbtusbドライバをmodprobeなどで一度rmmodしてからinsmodをしてやるなどすると,bluetoothデバイスがつかえるようになります.

/usr/lib/firmware/brcmに移動してやる時のファイル名は,BCM2070A1-(VID)-(PID).hcdになっています.このファイル名はdmesgでファームウェアのロードに失敗している箇所でも確認可能です.

また,infにかかれているファームウェアファイルがかかれたセクションは一般にBlueRAMUSB(PID)になってると思われます.

なお,同様の手段でDell XPS13 (2015含む)などでもbluetoothがつかえます.

以上でした.