2015年04月12日

bluetooth 子機についての調査

Polasma は、bluetooth の子機になれない。SIM がなければ、消費電力の大きい Wi-Fi で接続するしかない。Pigu をルータにするとしても、両機とも待ち受け時間が短くなってしまう。これを、なんとかしたい。

一般的には、bluetooth の子機になれるのはタブレット。スマホにはあまり例がないようだ。不思議なことに Pigu は bluetooth の子機になれる。テストには使えるのはありがたいのではあるが、ルータとして使う予定なので 子機にしたいのは、Polasma なのだ。

最初のアプローチ


子機に出来るということは、PANU プロファイルをサポートしているということ。で、Pigu は、PANU をサポートしている。同じ MTK65XX でプロトコルスタックはたぶん同じ。これがどうなっているのか調べられると、なんとかなるかも知れない。ただ、Pigu は 4.4.2 で色々変わっているかも知れない。もう少し近いものはないのかと考えたのだが、Yoga タブレットがあった。SoC は、MTK6589 で、同じ MediaTek だから、プロトコルスタックは同じだろう。これも 子機になれるらしい。幸いなことに、needrom.com に 4.2.2 の ROM があった。 ちなみに、他社の BlueTooth は、bluez を使っている場合が多いのだが、MediaTek は独自の、プロトコルスタック を使っている。で、情報が少なくどういう構造かも調べられていない。

 ・ http://www.needrom.com/download/yoga-8-b6000/

それはともかく、これである。で、ダウンロードしてみることに。

中身は、SP Flash Tool でインストールするイメージであった。system.img も含まれている。喜び勇んで Linux で mount しようとしたが出来ない。調べてみたら、ファクトリーイメージは簡単な圧縮をしている場合があるとのこと。

 ・ https://code.google.com/p/usefulshellscript/source/browse/trunk/simg2img.py

これを使ったところ、通常の ext4 のイメージに変換できた。ここまで来るのに随分と苦労したが、全部略。とにもかくにも、スタート地点に立てた。

これをどうやって調べるのであろうか? とりあえず、Polasma とファイルを比較してみよう。

diff -ru で全部を比較し、目にとまったところをピックアップ。(+ が Yoga)

/factory_init.rc:
+ # BT
chmod 0660 /dev/stpbt
chown bluetooth radio /dev/stpbt

init.charging.rc:
+ mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack
+#need to check
+# mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth
mkdir /data/misc/bluetooth 0770 system system

# for ppp options file
- mkdir /data/misc/ppp
- chmod 0777 /data/misc/ppp
+ mkdir /data/misc/ppp 0770 bluetooth net_bt

- # BT relayer mode used VCOM
- chown bluetooth radio /dev/ttyGS2
- chmod 0660 /dev/ttyGS2
-
# bluetooth
mkdir /data/@btmtk 0770 bluetooth net_bt
chown bluetooth bluetooth /dev/hid-keyboard

@@ -1183,13 +1155,13 @@
socket bt.int.adp dgram 660 bluetooth net_bt
socket bt.a2dp.stream dgram 660 bluetooth net_bt
user bluetooth
- group system net_bt bluetooth net_bt_admin sdcard_rw inet net_admin nvram net_raw
+ group net_bt bluetooth net_bt_admin sdcard_rw inet net_admin nvram net_raw

/system/build.prop:
ro.build.characteristics=default
+ro.build.characteristics=tablet

# begin mediatek build properties
-ro.mediatek.version.release=ALPS.JB5.MP.V1.5
-ro.mediatek.platform=MT6582
+ro.mediatek.version.release=ALPS.JB2.MP.V1.17
+ro.mediatek.platform=MT6589

/ueventd.rc:
#MTK BTIF driver
-/dev/btif 0660 shell system

すべてを比較してこれぐらいなのであった。
Yoga は、MT6589 で同じシリーズであった。net_bt_stack というグループがあるし、BT子機は、サポートしてそうな印象。

# bluetooth power up/down interface
chown bluetooth net_bt_stack /dev/ttyHS0
chown bluetooth net_bt_stack /proc/bluetooth/sleep/proto
chmod 0600 /dev/ttyHS0
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type
chown bluetooth net_bt_stack /proc/bluetooth/sleep/proto

これは、多分 bluz の bluetooth だが、コメントから見るに、やっぱり子機用の group っぽい。


yoga/init.charging.rc: mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stac
yoga/init.rc: mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack
yoga/ueventd.rc:/dev/uhid 0660 system net_bt_stack
yoga/ueventd.rc:/dev/uinput 0660 system net_bt_stack

pigu/init.rc: mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack
pigu/init.rc: group system net_bt bluetooth net_bt_admin sdcard_rw inet net_admin nvram net_raw vpn net_bt_stack media_rw sdcard_r
pigu/ueventd.rc:/dev/uhid 0660 system net_bt_stack
pigu/ueventd.rc:/dev/uinput 0660 system net_bt_stack

polasma/ueventd.rc:/dev/uhid 0660 system net_bt_stack
polasma/ueventd.rc:/dev/uinput 0660 system net_bt_stack

pigu と yoga には、/data/misc/bluedroid がある。


どうやら bluedroid というのがキーワードらしい。ググると、以下の url が。

 ・ https://wiki.mozilla.org/B2G/Bluetooth-bluedroid

非常に重要なことが書いてある予感。なんでも、bluz と切り替えることも可能らしい。
Switch Bluetooth stack bewteen bluez/bluedroid
For version JB 4.2, if you want to use bluez on JB, you need to modify some files. See [Bug 911038][1]


で、bluedroid を動かすには以下のファイルが重要なようだ。

Gecko bluetotoh will run bluedroid now.

### replace_bluedroid_reply.sh
adb push audio.a2dp.default.so /system/lib/hw
adb push bt_stack.conf /system/etc/bluetooth
adb push bt_did.conf /system/etc/bluetooth
adb push stack.conf /system/etc/bluetooth
adb push auto_pair_devlist.conf /system/etc/bluetooth
adb push libbt-utils.so /system/lib
adb push libbt-hci.so /system/lib
adb push bluetooth.default.so /system/lib/hw
adb push bdt /system/bin
######## vendor #########
adb push libbt-vendor.so /system/vendor/lib


こういったファイルがあるのは、どうやら pigu のみ。ただし、全く同じというわけではない。

pigu/system/vendor/lib/hw/audio.a2dp.blueangel.so
pigu/system/vendor/lib/hw/bluetooth.blueangel.so
pigu/system/etc/bluetooth/bt_stack.conf
pigu/system/etc/bluetooth/bt_did.conf
pigu/system/etc/bluetooth/auto_pair_devlist.conf
pigu/system/lib/libbt-hci.so
pigu/system/lib/libbt-utils.so
pigu/system/lib/hw/bluetooth.default.so

bdt ってのは全くない。何かわからないが mtkbt だろうか?

strings pigu/system/bin/mtkbt |grep /dev
/data/@btmtk/devdb
/dev/uinput
/dev/uhid
/dev/socket/bt.int.adp
/dev/tun
/dev/ampc0
/dev/socket/bt.int.adp
/dev/socket/palhal
/dev/socket/paltimersock
/dev/socket/palinjectsock
/dev/socket/halpal

なにかそれっぽい。では、polasma や yoga にないかというとあるのである。

strings polasma/system/bin/mtkbt |grep /dev
/data/@btmtk/devdb
/dev/uinput
/dev/hid-keyboard
/dev/socket/bt.int.adp
/dev/btn
/dev/ampc0
/dev/socket/bt.int.adp
/dev/socket/palhal
/dev/socket/paltimersock
/dev/socket/palinjectsock
/dev/socket/halpal

strings yoga/system/bin/mtkbt |grep /dev
/data/@btmtk/devdb
/dev/uinput
/dev/hid-keyboard
/dev/socket/bt.int.adp
/dev/btn
/dev/ampc0
/dev/socket/bt.int.adp
/dev/socket/palhal
/dev/socket/paltimersock
/dev/socket/palinjectsock
/dev/socket/halpal

ただ、/dev/tun がない。/dev/uhid も。代わりに /dev/hid-keyboard , /dev/btn がある。入れ替えて動くかどうかは、非常に怪しい。また、yoga には、/dev/tun がない。やはりこれなのか?

ちなみに、ソースコードは、
 ・ mediatek/protect/external/bluetooth/blueangel/btcore/
こういうパスになっている。もし手に入るのであれば、ビルドするというのも手かも知れない。

だんだん分かってきた。blueangel とは、MediaTek 独自のプロトコルスタックでクローズソース。ファイル構造の類似性から bluedroid をベースにしているのだろう。

 ・ https://github.com/mozilla-b2g/platform_external_bluetooth_bluedroid

さて、Yoga の 4.2.2 は多分 BT子機にはなれないのではないか?
で、なんでも良いから 4.2.2 の MediaTek タブレットと思って探してみたら、Ainol があった。
ちょっと新しそうな Novo7 AX3 のファームウェアをダウンロードしてみることに。

... ダメだった。全部同じで /dev/tun を使っていない。おそらく 4.2.2 は全部ダメなのかも。 Yoga は、4.4.2 の update が出ているし、4.4.2 なら BT子機 になれるのだろう。

こうなると、Pigu の mtkbt を動かせないか? 先の B2G/Bluetooth-bluedroid ではいくつかのファイルをインストールするだけで使えるようだし、意外と依存性はないかも知れない。今のところ uhid がないだけみたいだし。uhid のカーネルモジュールを作れれば終わる話かも。

で、uhid を見てみたが、HID さえ Config されていれば良いらしい。カーネルビルド環境ないのだが、どうしよう。

gcc があるんだから、セルフで build すれば良いじゃないか ... なんてのは相当に甘かった。
いきなり grep -P なんてのでエラーになって、念のために いろいろ grep したら perl5 や python を使っている。これは無理。
posted by すz at 04:34| Comment(0) | TrackBack(0) | android
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/115883865
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック