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
以上