23. 2.3 組込み開発に必要な環境
・JNI(Java Native Interface)の役割
JNIはJavaからネイティブコードを呼び出せる仕組み。
JavaとC/C++を結び付けるライブラリと、I/F規約の構
成。
23This material is licensed under the Creative Commons License BY-NC-SA 4.0.
24. 2.3 組込み開発に必要な環境
・提供されている開発ツールとして、下記2つがあります
ー Android SDK【Software Development Kit】
バーチャルマシーン(Dalvik VM)上で動作する
Android
アプリケーションを作成する為のツール
ー Android NDK【Native Development Kit】
ネイティブ開発環境。ハードウェアへ直接アクセ
スする
プログラムを作成する事ができます。C又はC+
+で作成
し、作成した関数をJavaソースコード側から呼
び出しがで 24This material is licensed under the Creative Commons License BY-NC-SA 4.0.
45. 3.7 BeagleBoardへポーティング
45
・ Bluetooth USBアダプタ
AndroidではBluetoothモジュールの電源制御に
RF KillというKernelの機能(Switch Class)を使用し
ますが,Bluetooth USBアダプタはこの仕組みに対
応していません.Bluetoothの電源制御は
libbluedroidライブラリで実施しており、ソース・
コードを修正する必要があります
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
54. 3.7 BeagleBoardへポーティング
54
・ SDカード有効化
Androidではvold (ボリューム・デーモン)がSD
カードのマウントを行います。デフォルトではエ
ミュレータ用のvold設定ファイル(vold.conf)が
インストールされますが、このファイルを
BeagleBoard用の設定に修正します。
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
62. 4.2 開発環境
• NDK(Native Development Kit)
AndroidアプリケーションはDalvikVM上で動作
しますが、NDKを利用してネイティブコードに
置き換えることができる。
62This material is licensed under the Creative Commons License BY-NC-SA 4.0.
63. 4.2 開発環境
63
C/C++ ソースコー
ド
コンパイラ
中間ライブラリ
リンカ
各種ライブラリ
ネイティブコード
ライブラリ
Java ソースコード
コンパイラ
DalvikVM変換
各種
Javaライブラ
リ
Return ネイティブコードCALL
DalvikVM
バイトコード
ネイティブコード
ライブラリ
Android NDK
Android SDK
Android
アプリケーショ
ン
• NDKの概要
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
69. 4.3 beagleboardを動かす準備
• ソース取得
wgetコマンドを使用し、Androidカーネルソース
一式をダウンロードし取得致します。
69
$ wget http://software-
dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_De
vKit_2_1/exports/TI_Android_GingerBread_2_3_4Sources.tar.gz
$ tar -xvzf TI_Android_GingerBread_2_3_4Sources.tar.gz
$ cd TI_Android_GingerBread_2_3_4Sources
$ ./.repo/repo/repo sync --local-only
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
87. 5.1 LEDドライバ
• このuser0, user1のLEDを制御するドライバはLinux標準のLED Class フ
レームワークを利用して実装されています。
87
SYSFSインタフェース
LED Class フレームワーク
LED GPIOドライバ
user0
LED
user1
LED
ユーザ空間
カーネル空間
ハードウェア
LED トリガードラ
イバ
ユーザ空間プログラム
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
88. 5.1 LEDドライバ
• カーネルコンフィギュレーション変更
LED Classフレームワーク、 LED GPIOドライバ、 LEDトリガードライ
バを利用するにはカーネルコンフィギュレーションの変更が必要と
なります。
カーネルコンフィギュレーション変更方法
88
$ cd kernel
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
89. 5.1 LEDドライバ
• コンフィグを有効化
Spaceキーを押下し、対象のコンフィグを有効化します。
89
Device Drivers --->
[*] LED Support (CONFIG_NEW_LEDS) --->
[*] LED Class Support (CONFIG_LEDS_CLASS)
*** LED drivers ***
<*> LED Support for GPIO connected LEDs (CONFIG_LEDS_GPIO)
[*] Platform device bindings for GPIO LEDs (CONFIG_LEDS_GPIO_PLATFORM)
[*] LED Trigger support (CONFIG_LEDS_TRIGGERS)
*** LED Triggers ***
<*> LED Heartbeat Trigger (CONFIG_LEDS_TRIGGER_HEARTBEAT)
<*> LED Default ON Trigger (CONFIG_LEDS_TRIGGER_DEFAULT_ON)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
98. 5.3 LEDドライバの作成
• OMAP Pin接続状況
EXPANSIONヘッダとOMAP Pinの接続状況は、BBSRM
(BeagleBoard System Reference Manual)で確認できます。
BBSRMのPage96のTable20に、EXPANSIONヘッダのコネクタ番号とOMAP Pin番号の
対応表があります。
<参考>
http://beagleboard.org/static/BBSRM_latest.pdf)
98This material is licensed under the Creative Commons License BY-NC-SA 4.0.
99. 5.3 LEDドライバの作成
• コネクタ番号とOMAP Pin番号の対応表
今回は、コネクタ番号24/OMAP Pin AF15(GPIO 168)を使用してLEDを追加実装します。
99
:
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
100. 5.3 LEDドライバの作成
• OMAP PinはPin Multiplex(PinMux)の設定により、GPIOやI2Cなど最大8つの機
能(Mode0~Mode7)を切り替えて使用することができます(OMAPのレジスタ
でPinMuxを制御)。
• PinMuxのレジスタの詳細は
「OMAP35x Applications Processor Technical Reference Manual(OMAP35xx
TRM)」
(http://www.ti.com/lit/ug/spruf98u/spruf98u.pdf)で確認できます。
• PinMuxはU-BootおよびKernelで設定することが可能です。
100This material is licensed under the Creative Commons License BY-NC-SA 4.0.
101. 5.3 LEDドライバの作成
• PinMuxはU-BootおよびKernelで設定方法
PinMuxはU-BootおよびKernelで設定することが可能です。
※ PinMux対象のOMAP Pin AF15(GPIO 168)はMode0の機能がI2C2_SCLであり、方法1で設定すると、直後のI2C初期化関
数omap3_beagle_i2c_init()によりPinMuxがMode0に設定し直されてしまうため、本トレーニングでは方法2の
omap_mux_init_gpio()関数を利用します。
101
■U-Boot
【u-boot/board/ti/beagle/beagle.h】
・MUX_VAL()マクロで設定
■Kernel
【kernel/arch/arm/mach-omap2/board-omap3beagle.c】
方法1) OMAP3_MUX()マクロで設定しomap3_mux_init()で一括設定※
方法2) omap_mux_init_gpio()関数で設定
方法3) omap_mux_init_signal()関数で設定
方法4) __raw_write()関数でレジスタに直接設定
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
102. 5.3 LEDドライバの作成
omap_mux_init_gpio
【概要】 GPIO番号指定でPinMuxを初期化します。
【書式】 int omap_mux_init_gpio(int gpio, int val);
【引数】
int gpio GPIO番号を指定します。
int val MUXレジスタのオプション(下記参照)を指定します。
OMAP_PIN_OUTPUT(OMAP→GPIO方向の信号),
OMAP_PIN_INPUT(OMAP←GPIO方向の信号)等
【戻り値】 負値のエラーコードを返却します。
【例】 [kernel/arch/arm/mach-omap2/board-omap3beagle.c]
static void __init omap3_beagle_init(void)
{
:
ret = omap_mux_init_gpio(168, OMAP_PIN_OUTPUT);
if (ret)
printk(KERN_ERR “omap_mux_init_gpio() failed(%d)”, ret);
}
102This material is licensed under the Creative Commons License BY-NC-SA 4.0.
103. 5.4 LEDドライバ実習
103
実
習
【実習1】
LED Classフレームワークを利用してOMAP Pin
AF15(GPIO168)に接続されたLEDを制御せよ。 追加するコ
ードは10行以内とすること(異常時の処理は省略しても
構わない)
default_trigerは”default_on”を指定することとする。
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
105. 5.4 LEDドライバ実習
105
実
習
【実習1 回答確認】
• カーネルビルド
カーネルをビルドし、カーネルイメージをSDカードにコピーします。
$ cd kernel
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
$ cp arch/arm/boot/uImage /media/boot/
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
106. 5.4 LEDドライバ実習
106
実
習
【実習1 回答確認】
• シリアルコンソールからコマンド操作で、実装したLEDドライバが
正しく動作するかどうかを確認します。
$ cd /sys/class/leds/beagleboard::extled
# パーミッションを確認しておく
$ ls -l brightness
-rw-rw---- root root 4096 2000-01-01 00:00 brightness
# ※デフォルトではオーナー/グループ共にrootであるため、Frameworkからアクセスする際はアクセス権を変更する
(後述)
# 現在のLEDの状態を確認する
$ cat brightness
1
# LEDが消灯することを確認する
$ echo 0 > brightness
$ cat brightness
0
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
125. 5.12 Android HAL層
• Android HALレイア
HALとは、ハードウエアを抽象化するライブラリ を指し
ます。
HALはデバイスのラッパー機能という位置付けで
Android Frameworkからデバイスに簡単にアクセスできるよ
う 125
Androidプラットフォーム
アプリケーション
Androidフレームワーク
Linuxカーネル
ハードウェア
アプリケーション
ライブラリ/ネイティブ
HAL(Hardware Abstruction Layer)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
126. 5.12 Android HAL層
• Android HAL
126
Androidプラットフォーム
アプリケーション
Androidフレームワーク
Linuxカーネル
ハードウェア
アプリケーション
ライブラリ/ネイティブ
HAL(Hardware Abstruction Layer)
グラ
フィック
Audio カメラGPS
Bluetooth
Radio Layer
Interface
(RIL)
Wi-Fi
スマートフォンで実装されて
いるデバイスはほとんど
用意されている
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
127. 5.12 Android HAL層
• Android HALのレイアイメージ
127
Framework
External Libraries
Runtime
XXXXXXX.so (libhardware_legacy )
Linux Device Driver
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
128. 5.12 Android HAL層
• Android HALの使用イメージ
128
Service/JNI
Framework/base/services/jni
Java Stub
HAL
Hardware/libhardware
sysfs /sys
HAL Stub
Kernel Modules
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
129. 5.12 Android HAL層
• Android HALのメリット
1.Linuxへの依存をHAL層で吸収。
デバイスを抽象化することで、独立性を高めLinuxの
依存
度を低くできる。
上位層(アプリケーション等)をハードウェアから分離で
きる。
129This material is licensed under the Creative Commons License BY-NC-SA 4.0.
130. 5.12 Android HAL層
• Android HALのメリット
2.GPL汚染の心配がない
Androidプラットフォームと分離することにより、ラ
イセンス
の影響を抑えられる。
HAL部分はカーネルとリンクはしない為、ソースを
公開する
必要がない
(HAL層はApacheライセンス、LinuxドライバはGPLライ
センス)
130This material is licensed under the Creative Commons License BY-NC-SA 4.0.
131. 5.12 Android HAL層
• Android HALでの注意点
ドライバに特殊な技術を実装した場合、ソース公開に
より
読み取られる場合がある。
技術隠ぺいの為、特殊なアルゴリズムはユーザー空間
側に
置く事ができるが、パフォーマンスを重視する場合は
注意する必要がある。
131This material is licensed under the Creative Commons License BY-NC-SA 4.0.
132. 5.12 Android HAL層
• ポーティング手順から見たHAL
1. Android向けドライバの入ったLinux Kernelをター
ゲット
上で動作させる
(一般的にはボードメーカーによりBSPとして提供)
2.アーキテクチャに合わせてAndroidをビルド
3.各種設定ファイルをアーキテクチャ(ターゲット
ボード)に
合わせてカスタマイズする
4.接続デバイスのHALを用意(各種センサー、カメラ
等)
5.ターゲットボード動作検証
132This material is licensed under the Creative Commons License BY-NC-SA 4.0.
133. 5.12 Android HAL層
• AndroidフレームワークのHALインターフェイス
以下のセンサー類のインターフェイスが用意されてい
ます。
インターフェイス定義先
hardware/libhardware/include/hardware/sensors.h
サポートする為にはセンサー対応のドライバと
Androidフレームワーク側の対応(実
装)が必要となります。
133
デバイス名(センサー名)
加速度センサー
近接センサー
ジャイロセンサー
(ジャイロスコープ)
磁気センサー
気圧センサー
光センサー
温度センサー
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
134. 5.12 Android HAL層
• 使用頻度の高いHALインターフェイス(GPS編)
良く使用するHALとしてGPS用が用意されている
インターフェイス定義先
include/hardware/gps.h
Androidで使用する際は、このHALインターフェイスを共有ライブラリをしてBuild
する
必要があります。
134This material is licensed under the Creative Commons License BY-NC-SA 4.0.
135. 5.12 Android HAL層
• 使用頻度の高いHALインターフェイス(GPS編)
ハードウェア構成イメージ
135
Android
MAP系アプリケーショ
ン
Android Framework
Libgps.so
Linux
シリアル通信
GPSドライバ
GPSデバイス
USB
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
136. 6.GPIOドライバ
• 6章はBeagle Board のLEDをコントロールするGPIOドライ
バを開発します。
6章の進め方は配布したソースコードの内容を確認し、
モジュールをビルドしながら実習を進めて行きます。
136This material is licensed under the Creative Commons License BY-NC-SA 4.0.
138. 6.GPIOドライバ
・GPIOポートから、モーター制御用信号を送信するドラ
イバを作成します
138
Expansion N o G PIO ポートLED
18 G PIO _159 青
19 G PIO _131 赤
20 G PIO _156 白
21 G PIO _130 黄色
23 G PIO _183 緑
24 G PIO _168 紫
B eagleboard Expansion
1 3 5 7 9 11 13 15 17 19 21 23 25 27
2 4 6 8 10 12 14 16 18 20 22 24 26 28
【実習2 】
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
Copyright 2012, Open Embedded Software Foundation, All rights reserved
151. 7.USB無線LANアダプタのポーティング
151
【device/ti/beagleboard/init.rc】
# 以下のサービスを追加します。(hostapdはWiFiテザリング時に必要なサービスであり本トレーニングでは使用しま
せん)
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
disabled
oneshot
service hostapd /system/bin/hostapd_wps /data/misc/wifi/hostapd.conf
disabled
oneshot
service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL wlan0
disabled
oneshot
WiFiのnetwork interfaceの名前をシステムプロパティ※として登録している箇所があるため、
RTL8192CUドライバのnetwork interface名である"wlan0"に変更します。
【device/ti/beagleboard/init.rc】
<変更前>
setprop wifi.interface tiwlan0
<変更後>
setprop wifi.interface wlan0
※Androidシステムプロパティは、DalvicVM上のプログラム(Java)、ネイティブプログラム(C/C++)のどちらからでも参照可能な帯域変数。
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
152. 7.USB無線LANアダプタのポーティング
152
• 以下の手順でユーザランドとカーネルを再ビルドします。
$ source build/envsetup.sh
$ make TARGET_PRODUCT=beagleboard TARGET_BUILD_VARIANT=eng
OMAPES=3.x -j4
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules
RTL8192CUドライバはカーネルコンフィグで「モジュール」としてビルド
するようにに指定(CONFIG_RTL8192CU=m)しているため、別途以下の手順で
ビルドします。
4.3章と同様の方法でSDカードにビルドイメージをコピーします。 この
際に上記手順でビルドしたRTL8192CUドライバモジュールもSDカード
にコピーします。$ mkdir /media/rootfs/system/wifi/
$ cp kernel/drivers/net/wireless/rtl8192cu/8192cu.ko /media/rootfs/system/wifi/
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
153. 8.Tablet連携
• 起動用SDカードの作成
153
カーネルイメージのコピー
(※ビルド済のファイルは、/media/userdata/android/training/07_wifi/complete/ に収録しています)
# cd /media/userdata/android/training/07_wifi/complete/
# tar xvzf build_images.tar.gz
# sudo cp -a out/target/product/beagleboard/root/* /media/rootfs/
# sudo cp -a out/target/product/beagleboard/system/* /media/rootfs/system/
# sudo cp -a out/target/product/beagleboard/data/* /media/rootfs/data/
# sudo mkdir -p /media/rootfs/system/wifi/
# sudo cp -a kernel/drivers/net/wireless/rtl8192cu/8192cu.ko
# sudo cp -a kernel/arch/arm/boot/uImage /media/boot/
This material is licensed under the Creative Commons License BY-NC-SA 4.0.