Armadillo-420でBluetooth Low Energyモジュールを利用して通信を行うための手順です。 動作確認については十分にできていませんが、ご参考にしていただければと思います。
1. ATDE5をダウンロード
Armadillo-420の開発環境はATDE3となっていますが、Bluezの新しいバージョンについては、 ビルドにGLibの2.28以上が必要です。
atmark@atde3:~bluez-5.18$ ./configure --build=i686 --host=arm-linux-gnueabi …省略… checking for GLIB... no configure: error: GLib >= 2.28 is required
しかし、ATDE3のGLibのバージョンは2.16.6です。
atmark@atde3:~$ cat /usr/arm-linux-gnueabi/lib/pkgconfig/glib-2.0.pc |grep Version Version: 2.16.6
そのため開発環境としてはATDE5を使うことにします。 ATDE5は以下からダウンロードが可能です。
[ATDE5 (i386向け VMware仮想イメージファイル)]
http://armadillo.atmark-techno.com/files/downloads/armadillo-840/atde/atde5-i386-20140131.tar.xz
[ATDE5 (amd64向け VMware仮想イメージファイル)]
http://armadillo.atmark-techno.com/files/downloads/armadillo-840/atde/atde5-amd64-20140131.tar.xz
2. Bluezをビルド
2.1 Bluez 5.18をダウンロードして展開します。(2014.6時点で最新は5.19です)
atmark@atde5:~$ wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.18.tar.xz atmark@atde5:~$ tar Jxf bluez-5.18.tar.xz
2.2 libicalのクロスパッケージをインストールします
atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/main/libi/libical/libical0_0.48-2_armel.deb atmark@atde5:~$ dpkg-cross -v --build --arch armel libical0_0.48-2_armel.deb atmark@atde5:~$ sudo dpkg -i libical0-armel-cross_0.48-2_all.deb atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/main/libi/libical/libical-dev_0.48-2_armel.deb atmark@atde5:~$ dpkg-cross -v --build --arch armel libical-dev_0.48-2_armel.deb atmark@atde5:~$ sudo dpkg -i libical-dev-armel-cross_0.48-2_all.deb
2.3 configureを実行します
atmark@atde5:~$ cd bluez-5.18/ atmark@atde5:~/bluez-5.18$ ./configure --build=i686 --host=arm-linux-gnueabi --disable-udev --disable-systemd
*udevはdisableにしています。 udevをenableにするには、--with-udevdirを指定する必要がありますが、この場合2.4のmakeでビルドエラーが発生します。
2.4 makeを実行します
atmark@atde5:~/bluez-5.18$ make
3. カーネルを展開して修正
BLEに対応するためにはArmadillo-420のカーネル2.6.xでは古すぎるため、3.5.7からBluetoothに関連する ソースコードのみをバックポートします。 本記事では使用しませんが、USBデバイス機能も使用したかったので、ベースとなるカーネルは 2.6.35.alpha4とします。 (2.6.26では未検証です)
3.1 カーネルをダウンロードして展開します。
atmark@atde5:~/bluez-5.18$ cd atmark@atde5:~$ wget http://download.atmark-techno.com/armadillo-4x0/source/kernel/pre-release/linux-2.6.35-at-alpha4.tar.gz atmark@atde5:~$ tar xf linux-2.6.35-at-alpha4.tar.gz
3.2 USBデバイス対応のためのパッチをダウンロードして適用します
atmark@atde5:~$ cd linux-2.6.35-at-alpha4/ atmark@atde5:~/linux-2.6.35-at-alpha4$ wget http://armadillo.atmark-techno.com/files/downloads/sample/a400-use-usb-gadget/linux-2.6.35-usb-device-only.patch atmark@atde5:~/linux-2.6.35-at-alpha4$ patch -p1 < ./linux-2.6.35-usb-device-only.patch atmark@atde5:~/linux-2.6.35-at-alpha4$ wget http://download.atmark-techno.com/misc/linux-2.6.35-at-alpha4_a410.diff atmark@atde5:~/linux-2.6.35-at-alpha4$ patch -p1 < ./linux-2.6.35-at-alpha4_a410.diff
3.3 kernel3.5.7のソースコードをダウンロードして展開します
atmark@atde5:~/linux-2.6.35-at-alpha4$ cd atmark@atde5:~$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.7.tar.gz atmark@atde5:~$ tar xf linux-3.5.7.tar.gz
3.4 kernel2.6.35.alpha4のBluetoothソースを、3.5.7のソースに置き換えます
atmark@atde5:~$ rm -rf linux-2.6.35-at-alpha4/net/bluetooth/* atmark@atde5:~$ rm -rf linux-2.6.35-at-alpha4/drivers/bluetooth/* atmark@atde5:~$ rm -rf linux-2.6.35-at-alpha4/include/net/bluetooth/* atmark@atde5:~$ cp -r linux-3.5.7/net/bluetooth/* linux-2.6.35-at-alpha4/net/bluetooth/ atmark@atde5:~$ cp -r linux-3.5.7/drivers/bluetooth/* linux-2.6.35-at-alpha4/drivers/bluetooth/ atmark@atde5:~$ cp -r linux-3.5.7/include/net/bluetooth/* linux-2.6.35-at-alpha4/include/net/bluetooth/
3.5 bluetooth周りのソースコードを修正します
今回は3.5.7のどこのソースを修正したかがわかりやすいように、あえて3.5.7のBluetoothソースコードに対するパッチを作成し、修正箇所の前にコメントで // backport と入れています。
linux-3.5.7-bluetooth-backport.patchは以下からダウンロードしてください。
linux-3.5.7-bluetooth-backport.patch
atmark@atde5:~$ cd linux-2.6.35-at-alpha4/ atmark@atde5:~/linux-2.6.35-at-alpha4$ patch -p1 < ./linux-3.5.7-bluetooth-backport.patch
参考までに、今回修正したソースは以下の通りです。
# modified: drivers/bluetooth/btusb.c # modified: include/net/bluetooth/bluetooth.h # modified: net/bluetooth/hci_core.c # modified: net/bluetooth/hci_sock.c # modified: net/bluetooth/hci_sysfs.c # modified: net/bluetooth/l2cap_core.c # modified: net/bluetooth/l2cap_sock.c # modified: net/bluetooth/lib.c # modified: net/bluetooth/rfcomm/tty.c
4. ユーザーランドを展開
4.1 ソースコードをダウンロードし、展開します
atmark@atde5:~/linux-2.6.35-at-alpha4$ cd atmark@atde5:~$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-440/source/dist/atmark-dist-20140415.tar.gz atmark@atde5:~$ tar xf atmark-dist-20140415.tar.gz atmark@atde5:~$ ln -s atmark-dist-20140415 atmark-dist atmark@atde5:~$ cd atmark-dist atmark@atde5:~/atmark-dist$ ln -s ../linux-2.6.35-at-alpha4 ./linux-2.6.x
5. カーネルをコンフィギュレーション
5.1 make menuconfigでvendor/Productを指定します
atmark@atde5:~/atmark-dist$ make menuconfig Main Menu Vendor/Product Selection ---> (AtmarkTechno) Vendor (Armadillo-420) AtmarkTechno Products
5.2 make menuconfigでABIをarmelに変更します
Kernel/Library/Defaults Selection (armel) Cross-dev
5.3 カーネルコンフィギュレーションでBluetoothを有効にします
Linux Kernel Configuration [*] Networking support ---> <*> Bluetooth subsystem support ---> ←チェックをつける <*> RFCOMM protocol support ←チェックをつける [*] RFCOMM TTY support ←チェックをつける Bluetooth device drivers ---> <*> HCI USB driver ←チェックをつける
6. ユーザーランドをコンフィギュレーション
6.1 busyboxのバージョンを1.20.2に上げます
atmark@atde5:~/atmark-dist$ make menuconfig Userland Configuration BusyBox ---> [*] BusyBox (v1.20.2) Version Configuration menu ---> ←選択してデフォルト設定のままとしてください
6.2 zcipを外します
Network Applications ---> [] zcip ←チェックを外す
7. makeを実行
atmark@atde5:~/atmark-dist$ make
8. D-busをatmark distにインストール
8.1 DebianパッケージのD-busをダウンロードします
atmark@atde5:~/atmark-dist$ cd atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/main/d/dbus/dbus_1.6.8-1+deb7u1_armel.deb
8.2 D-busパッケージをatmark distのROMイメージディレクトリに展開します
atmark@atde5:~$ dpkg -x dbus_1.6.8-1+deb7u1_armel.deb atmark-dist/romfs/
8.3 不要なドキュメントファイルなどを削除します
atmark@atde5:~$ rm -rf atmark-dist/romfs/usr/share/doc atmark@atde5:~$ rm -rf atmark-dist/romfs/usr/share/man
8.4 D-busが必要とするinit-funcionsをatmark distのROMイメージディレクトリに展開します
atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/main/l/lsb/lsb-base_4.1+Debian8+deb7u1_all.deb atmark@atde5:~$ dpkg -x lsb-base_4.1+Debian8+deb7u1_all.deb atmark-dist/romfs/ atmark@atde5:~$ rm -rf atmark-dist/romfs/usr/share/doc
8.5 D-busデーモンを実行するユーザ/グループを追加します
atmark@atde5:~$ vi atmark-dist/vendors/AtmarkTechno/Armadillo-420/etc/passwd
ファイル末尾に以下の行を追加します
messagebus:x:101:105::/var/run/dbus:/bin/false
atmark@atde5:~$ vi atmark-dist/vendors/AtmarkTechno/Armadillo-420/etc/group
ファイル末尾に以下の行を追加します
messagebus:x:105:
9. Bluezをatmark distにインストール
9.1 Debianパッケージのbluezパッケージをダウンロードします
今回はビルドしたbluz(5.18)により近いバージョン(5.17)のパッケージをダウンロードします
atmark@atde5:~$ wget http://ftp.jp.debian.org/debian/pool/main/b/bluez/bluez_5.17-1~exp0_armel.deb
9.2 bluzパッケージをatmark distのROMイメージディレクトリに展開します
atmark@atde5:~$ dpkg -x bluez_5.17-1~exp0_armel.deb atmark-dist/romfs/
9.3 不要なドキュメントファイルなどを削除します
atmark@atde5:~$ rm -rf atmark-dist/romfs/usr/share/doc atmark@atde5:~$ rm -rf atmark-dist/romfs/usr/share/man atmark@atde5:~$ rm -rf atmark-dist/romfs/lib/udev
9.4 バイナリファイルをビルドした5.18のものと置き換えます
atmark@atde5:~$ cp bluez-5.18/tools/bccmd atmark-dist/romfs/usr/bin/bccmd atmark@atde5:~$ cp bluez-5.18/client/bluetoothctl atmark-dist/romfs/usr/bin/bluetoothctl atmark@atde5:~$ cp bluez-5.18/monitor/btmon atmark-dist/romfs/usr/bin/btmon atmark@atde5:~$ cp bluez-5.18/tools/ciptool atmark-dist/romfs/usr/bin/ciptool atmark@atde5:~$ cp bluez-5.18/attrib/gatttool atmark-dist/romfs/usr/bin/gatttool atmark@atde5:~$ cp bluez-5.18/tools/hciattach atmark-dist/romfs/usr/bin/hciattach atmark@atde5:~$ cp bluez-5.18/tools/hciconfig atmark-dist/romfs/usr/bin/hciconfig atmark@atde5:~$ cp bluez-5.18/tools/hcitool atmark-dist/romfs/usr/bin/hcitool atmark@atde5:~$ cp bluez-5.18/tools/l2ping atmark-dist/romfs/usr/bin/l2ping atmark@atde5:~$ cp bluez-5.18/tools/l2test atmark-dist/romfs/usr/bin/l2test atmark@atde5:~$ cp bluez-5.18/tools/rctest atmark-dist/romfs/usr/bin/rctest atmark@atde5:~$ cp bluez-5.18/tools/rfcomm atmark-dist/romfs/usr/bin/rfcomm atmark@atde5:~$ cp bluez-5.18/tools/sdptool atmark-dist/romfs/usr/bin/sdptool atmark@atde5:~$ cp bluez-5.18/src/bluetoothd atmark-dist/romfs/usr/lib/arm-linux-gnueabi/bluetooth/bluetoothd
*ここは非常にめんどくさい手順にしていますが、bluezのビルド時に--prefixをatmark-dist/romfsとかにしておいて、 make installするなどの手もあるかもしれません。(未検証)
10. イメージを再作成して、カーネル/ユーザーランドをArmadilloに書き込みます
atmark@atde5:~$ cd atmark-dist atmark@atde5:~/atmark-dist$ make romfs atmark@atde5:~/atmark-dist$ make image
*イメージの書き込み手順は省略
11. D-bus/Bluetoothを起動するように設定します
11.1 Armadilloにログインして、rc.localを編集します
[root@armadillo420-0 (ttymxc1) ~]# cd /etc/config/ [root@armadillo420-0 (ttymxc1) /etc/config]# vi rc.local 以下の2行を追加 /etc/init.d/dbus start /etc/init.d/bluetooth start
11.2 実行権限を付けた後、ROMに保存して再起動します
[root@armadillo420-0 (ttymxc1) /etc/config]# chmod +x rc.local [root@armadillo420-0 (ttymxc1) /etc/config]# flatfsd -s [root@armadillo420-0 (ttymxc1) /etc/config]# reboot
12. BLEデバイスと通信をしてみます
12.1 今回使用するBluetoothモジュールは以下になります
USBドングル : http://www.princeton.co.jp/product/ptmubt7.html
BLEデバイス : http://www.logitec.co.jp/products/bluetooth/lbtmpvru02/
12.2 USBドングルを認識しているか確認します
[root@armadillo420-0 (ttymxc1) ~]# hciconfig hci0: Type: BR/EDR Bus: USB BD Address: 00:1B:DC:06:C0:41 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING PSCAN RX bytes:2672 acl:9 sco:0 events:123 errors:0 TX bytes:1713 acl:6 sco:0 commands:61 errors:0
12.3 BLEデバイスを検索します
[root@armadillo420-0 (ttymxc1) ~]# hcitool lescan LE Scan ... 44:13:19:05:A8:5B LBT-VRU0234 44:13:19:05:A8:5B (unknown) (Ctrl-Cで停止)
12.4 BLEデバイスにコマンドを送信して、ベルを鳴らしたりLED点灯させます
[root@armadillo420-0 (ttymxc1) ~]# gatttool -i hci0 -b 44:13:19:05:A8:5B -I [44:13:19:05:A8:5B][LE]> connect Attempting to connect to 44:13:19:05:A8:5B Connection successful [44:13:19:05:A8:5B][LE]> char-write-cmd 0x000d 02 ←振動もしくはメロディ [44:13:19:05:A8:5B][LE]> char-write-cmd 0x000d 01 ←LED点灯
上記は以下のHPを参照しました。
http://tic-tacs.blogspot.jp/2014/01/bluetoothlowenergyble-1-linuxbluezble.html
以上