TV-box:Bluetoothに挑戦

先日はWi-Fiが使えるようになってネットワーク環境が改善されました。このIT6335チップはBT/WIFIコンボなのでWi-Fiが使えれば必然にBTも使えるようになるはずです。ちょうどArmbianのフォーラムでOrangePi3のBTのディスカッションがあったのでその情報を参考にセットアップしてみました。結論から言うとデバイスは立ち上がるものの不安定で接続ができいません。

画面のところまでできるのですがその後切断してしまいます。現在のところの設定です。

/etc/init.d/ap6255-bluetooth
    
    MAC_OPTIONS="11:22:33:44:55:66"
    PORT="ttyS1"
    echo 388 > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio388/direction
    echo 1 >/sys/class/gpio/gpio388/value

    /usr/bin/timeout 20s /usr/bin/brcm_patchram_plus \
                --patchram /lib/firmware/brcm/bcm4335tx6.hcd \
                --bd_addr $MAC_OPTIONS \
                --use_baudrate_for_download --no2bytes \
                --enable_lpm /dev/$PORT 2>&1

    hciattach /dev/$PORT any
    hciconfig hci1 up

追記1

coreelecから抜き出したFWで、bcm4335a0.hcdがもっともあっていることがわかりました。しかし次のエラーありデバイスに接続できません。

rfkill list; dmesg | egrep -i 'blue|firm'
0: hci0: Bluetooth
	Soft blocked: no
	Hard blocked: no
1: phy0: Wireless LAN
	Soft blocked: no
	Hard blocked: no
2: hci1: Bluetooth
	Soft blocked: no
	Hard blocked: no
[   15.487845] Bluetooth: Core ver 2.22
[   15.487909] Bluetooth: HCI device and connection manager initialized
[   15.487925] Bluetooth: HCI socket layer initialized
[   15.487930] Bluetooth: L2CAP socket layer initialized
[   15.487941] Bluetooth: SCO socket layer initialized
[   17.686355] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4335/1 wl0: Mar 24 2013 20:36:01 version 6.30.171.24.20 (B0 Station/P2P)
[   21.462530] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   21.462537] Bluetooth: BNEP filters: protocol multicast
[   21.462551] Bluetooth: BNEP socket layer initialized
[   76.064894] Bluetooth: HCI UART driver ver 2.3
[   76.064903] Bluetooth: HCI UART protocol H4 registered
[   76.064905] Bluetooth: HCI UART protocol BCSP registered
[   76.064947] Bluetooth: HCI UART protocol LL registered
[   76.064950] Bluetooth: HCI UART protocol ATH3K registered
[   76.064976] Bluetooth: HCI UART protocol Three-wire (H5) registered
[   76.065120] Bluetooth: HCI UART protocol Intel registered
[   76.065212] Bluetooth: HCI UART protocol Broadcom registered
[   76.065234] Bluetooth: HCI UART protocol QCA registered
[   76.065236] Bluetooth: HCI UART protocol AG6XX registered
[   76.065259] Bluetooth: HCI UART protocol Marvell registered
[   76.209240] Bluetooth: RFCOMM TTY layer initialized
[   76.209260] Bluetooth: RFCOMM socket layer initialized
[   76.209291] Bluetooth: RFCOMM ver 1.11
[   93.029258] Bluetooth: hci1: command 0x2005 tx timeout
[   95.045472] Bluetooth: hci1: command 0x200b tx timeout
[   97.061617] Bluetooth: hci1: command 0x200c tx timeout
[  240.032111] Bluetooth: hci1: command 0x2005 tx timeout
[  242.048336] Bluetooth: hci1: command 0x200b tx timeout
[  244.063908] Bluetooth: hci1: command 0x200c tx timeout
[  916.024770] Bluetooth: hci1: command 0x2005 tx timeout
[  918.040719] Bluetooth: hci1: command 0x200b tx timeout
[  920.056682] Bluetooth: hci1: command 0x200c tx timeout

調べてみるとカーネルの問題のようでパッチがでるのを待つしかないようです。

追記2

じつは諦めきれずにネットで検索して該当のFWを手当たりしだいにトライ&エラーを繰り返してやはり現状のFWが一番良いという結論に至りました。Coreelecでbcm4335a0.hcdのほかにbcm4335_V0343.0353.hcdというのがあり、こちらのほうが良さそうなので使ってみることにしました。さらに、起動スクリプトを見直してみました。

/etc/init.d/ap6255-bluetooth
    
    MAC_OPTIONS="11:22:33:44:55:66"
    PORT="ttyS1"
    echo 388 > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio388/direction
    echo 1 >/sys/class/gpio/gpio388/value

    /usr/bin/timeout 20s /usr/bin/brcm_patchram_plus \
                --patchram /lib/firmware/brcm/bcm4335tx6.hcd \
                --bd_addr $MAC_OPTIONS \
                --use_baudrate_for_download --no2bytes \
                 /dev/$PORT 2>&1

    hciattach /dev/$PORT any
    hciconfig hci1 up

これでリブートしてBTを有効にしたらなんと接続ができました。

追記3

ブート時にBTを有効にするにはsystemdを使います。

/etc/systemd/system/brcmfmac_sdio-firmware.service
[Unit]
Description=Broadcom sdio firmware update
After=network.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/etc/init.d/ap6255-bluetooth start

[Install]
WantedBy=multi-user.target

起動スクリプトを有効にします。

systemctl enable brcmfmac_sdio-firmware.service