ブログ

Armadillo-400シリーズでBLEを使ってみる

at_takuya.sasaki
2014年6月18日 17時47分

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

以上