Android™組込み開発基礎コース BeagleBoard編

7,002 views
7,260 views

Published on

OESF公認
Android™組込み開発基礎コース BeagleBoard編
公式トレーニングテキスト

Contributed by:
【作成】株式会社アイエスビー東北
    
【ご注意】
本テキストは、Creative Commons License BY-NC-SA 4.0のもとで提供されます。OESF会員またはコンソーシアムメンバーでない場合、本編の改変の有無にかかわらず、いかなる形態でも商用目的での利用は禁止されています。

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,002
On SlideShare
0
From Embeds
0
Number of Embeds
2,505
Actions
Shares
0
Downloads
0
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Android™組込み開発基礎コース BeagleBoard編

  1. 1. Androidポーティング 応用トレーニング Ver1.00(10)
  2. 2. テキストのご利用に関して 2 ・ 本コースのテキストは、 Creative Commons License BY-NC-SA 4.0に基づいて提供されています。OESF会員またはOESFエデュ ケーションコンソーシアムメンバーでない場合、内容の改変の有無 にかかわらず、商用目的での利用は禁止されています。 OESFおよびOESFエデュケーションコンソーシアムへの加入につ いては、以下のサイトをご覧ください。 ● OESF公式サイト http://www.oesf.jp/modules/about/index.php?content_id=12 ● OESFエデュケーションコンソーシアム公式サイト http://oesf-edu.com/aboutconsortium/ ・ 本教育プログラムは、その中で提供される教材全てを含め、 OESFからのいかなる保証もなしに提供されます。OESFは、本 コースの内容またはコースの詳細な情報を使用することに起因して、 または誤って使用することに起因して何らかの障害や法的な行為が 生じても、いかなる責任も負いません。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  3. 3. 講義の目的 • Androidのポーティングに関する 基本的な知識を身につける。 -カーネルの取得/Build方法 -Androidの起動 -デバイスドライバの開発 -各ツールの使用方法 ・実習を通して、ポーティング手法を体験 する。 3This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  4. 4. 1章.Androidとは 4This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  5. 5. 1章の概要 • 1.1 Androidとは? • 1.2 組込みAndroid OSとは • 1.3 Androidで出来る事 • 1.4 ライセンス • 1.5 組込み用途でのAndroidメリット 5This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  6. 6. 1.1 Androidとは? • Androidとは、携帯端末用のプ ラットフォームである。 • Linuxベースのオープンソース・O S、ミドルウェアなどソフトウェアス タックパッケージで構成されている。 • 主にスマートフォンやタブレットPCなど の携帯端末のプラットフォームとして利 用されている。 6This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  7. 7. 1.1 Androidとは? • Androidの歴史 7 日 付 内 容 2003年10月 Android社発足 2005年8月 GoogleがAndroid社買収 2007年11月 OHA(Open Handset Alliance)発足、SDK 1.0リリース 2009年4月~7月 SDK 1.5r1~1.5r3リリース DoCoMoより「HT-03A」発売 2009年9月 SDK 1.6リリース 2009年10月~12月 SDK 2.0/2.0.1リリース 2010年1月 SDK 2.1リリース 2010年5月~9月 SDK 2.2~2.2.1リリース 2010年12月~2011年2月 SDK 2.3~2.3.3リリース 2011年2月 SDK 3.0リリース 2011年5月~7月 SDK3.1/SDK3.2 2011年10 SDK4.0 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  8. 8. 1.2 組込みAndroid OSとは • 組込み開発はCPUパワー、メモリ制限との戦い ー 組込みデバイスに求められる高機能化に対する最適 化 が背景にある。従来の携帯電話に採用されている Symbian、KCP+ではコストがかかる ー スマートフォンで使用している高機能なデバイスの 環境が 利用できる ー デバイスにアクセスするフレームワークが用意され ている ー Linux同様にハードウェアの制御できるネイティブ コードの 8This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  9. 9. 1.3 Androidで出来る事 • Androidが提供する機能でスマートフォン 以外での組込みOSとして利用できる。 9 1.デバイスサポート 2.ユーザーインタフェース 3.開発環境 4.ライセンス This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  10. 10. 1.3 Androidで出来る事 10 ネットワーク接続、GPS 、各センサー、写真、動画の ハードウェアをサポート Linuxカーネル・ドライバが流用できる為、 様々なハードウェアに対応しやすく、ポーティングが可能 1.デバイスサ ポート This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  11. 11. 1.3 Androidで出来る事 11 タッチパネルでのGUI操作が可能 高度なインターフェースの利用が可能 組込み機器でも高度なインターフェースの利用が可能 2.ユーザーインタ フェース This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  12. 12. 1.3 Androidで出来る事 12 Javaを中心とした開発効率のよい、開発環境が使用できる JavaやC/C++等、高速な高級言語の使用が可能 ネイティブ層も使い慣れた言語で開発が可能 JavaScriptでのハードウェア制御、HTMLでのGUI画面開発。 3.開発環境 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  13. 13. 1.3 Androidで出来る事 13 ライセンスフリーなOS 組込み機器でもライセンスフリーは変わらず。 ただし、ネイティブ開発に関してはGPL汚染に 注意する必要がある 4.ライセンス This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  14. 14. 1.4 ライセンス 14 一般公衆利用許諾契約書で以下を承諾する 1、プログラムの実行 2、プログラムの動作を調べ、それを改変すること (ソースコードへのアクセスは、その前提になる) 3、複製物の再頒布 4、プログラムを改良し、改良を公衆にリリースする 権利(ソースコードへのアクセスは、その前提になる) GPLライセンス This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  15. 15. 1.4 ライセンス 15 他のライセンス プロダクト ライセンス Android Apache Licence 2.0 Androidエ ミュレータ GNU General Public Li cense(GPL) Eclipse Eclipse Public Licens e Webkit LGPL and BSD License Linux GNU General Public Li cense(GPL) This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  16. 16. 1.5 組込み用途での Androidメリット • 開発ツール、ソースコード、ドキュメントが無償で入手 できる。 ー Linuxカーネルを使用しており、フリーかつオープ ンなライ センスである ー Linuxの資産を活かせる (ライブラリ、ソフトウェアスタック) ー 高度な機能が利用できる。 (ネット接続、静止画、動画、各センサー) ー 技術習得コストが低い 16This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  17. 17. 2章概要 2.1 Android OS レイア構成 2.2 Android OS関係図 2.3 組込み開発に必要な環境 17This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  18. 18. • Android OSのレイア構成 実行が可能 2.1 Android OS レイア構成 18This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  19. 19. • Android の一般的なレイア概要 2.1 Android OS レイア構成 19This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  20. 20. • Android OSのレイア概要 2.1 Android OS レイア構成 20This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  21. 21. • Android OS bionicを含むレイア概要 2.1 Android OS レイア構成 21This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  22. 22. 2.2 Android OS関係図 22 Android アプリケー ション Android アプリケー ション Androidフレームワーク Androidアプリケーション JNIJNI Linux Kernel Dalvik VM HAL デバイスドライバ ライブラ リ ディスプレ イ ネットワー ク Bluetooth カメラ GPS Etc.. Etc.. This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  23. 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. 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.
  25. 25. 3章.組込みボードについて 25This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  26. 26. 3章概要 • 3.1 プラットフォーム • 3.2 MIPS • 3.3 MIPSシェア • 3.4 組込みボード BeagleBoard概要 • 3.5 BeagleBoard外観 • 3.6 BeagleBoardブロック図 • 3.7 BeagleBoardポーティング イメージ 26This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  27. 27. 3.1 プラットフォーム • Androidが動作するプラットフォーム Androidが動作するプラットフォームは広範囲に 存在します。 Androidで使用しているカーネルは、Linux2.6のカー ネルが動作することが最低条件となります。 27This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  28. 28. 3.1 プラットフォーム 1.Androidは基本的にARM系CPU向けに作成されてい る。 2.MIPS社でも開発ツールを市リリースしており、 MIPSベースでも動作可能。 Android on MIPS http://developer.mips.com/android/ Android on x86 http://www.android-x86.org/ 28This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  29. 29. 3.2 MIPS 29 1.MIPS MIPSは多くのライセンスを世界中の半導体メー カーなどに供与しており、さまざまな製品に搭載さ れている。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  30. 30. 3.3 MIPSシェア 2.製品別シェア 30This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  31. 31. 3.3 MIPSシェア 31This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  32. 32. 3.4 組込みボード BeagleBoard概要 • BeagleBoard(リビジョンC4) – CPU TI OMAP3530 – ARM Cortex-A8コア (720 MHz) • ARMベースのCPUコアとDSP(Digital Signal Processor)コ ア,2D/3Dグラフィックス・アクセラレータ・コアを統合 した米Texas Instruments社製チップ • ディジタル映像出力(HDMI)、SDカード,USB2.0ポー ト,RS-232Cポート,オーディオ入出力などな外部インタ フェースを備えている • NAND Flash メモリ 256M • RS-232C ポート,JTAG コネクタ 32This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  33. 33. 3.4 組込みボード BeagleBoard概要 ・ BeagleBoardを使用する理由 Androidが標準でサポートしているアーキテク トはARM系が多い。 32ビットの組込み機器向けCPUでARM系が使用 されている。 33This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  34. 34. 3.5 BeagleBoard外観 34This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  35. 35. 3.6 BeagleBoardブロック図 35This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  36. 36. 3.7 BeagleBoardポーティング イメージ 36 ・ BeagleBoardへ実装イメージ BeagleBoardに実装するために、Androidの ソースコードを取得し、コンパイルし実行コード を生成します。 PCではソースコードをコンパイルすれば、実 行ファイルが生成されますが、組込みではター ゲットとなる機器は開発できないケースが多い。 一般的には、別機器でコンパイルする「クロス コンパイル」を実施し実行コードを生成します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  37. 37. 3.7 BeagleBoardへポーティング 37 ・ ポーティング作業イメージ 1.クロスコンパ イル 環境構築 2.ソースコード取 得 3.ライブラリ、ド ライバ 開発 4.BeagleBoard用 クロスコンパイル 5.BeagleBoard イメージ転送 6.起動設定 Config等 7.Android 起動 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  38. 38. 3.7 BeagleBoardへポーティング 38 ・ クロスコンパイル環境 apt-getコマンドでAndroidのビルドの際に必 要なパッケージのインストールします。 主な作業としてツールチェーン(クロスコンパイ ラ)と DevKit向けのツールを導入します。 ※実際の作業は次章で実施します This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  39. 39. 3.7 BeagleBoardへポーティング 39 ・ uImageツール導入 Kernelイメージはu-bootが扱えるuImage形式に する必要があるため,イメージ作成ツールを導入 します This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  40. 40. 3.7 BeagleBoardへポーティング 40 ・ ソース取得準備 Androidのソース・コードの取得にはgitコマン ドのラッパ・スクリプトであるrepoを使用するた め,curlコマンドで取得します。 Androidのソース・コードはプロジェクトごと にgitレポジトリで管理されており,repoスクリプ トを使用して複数のレポジトリからソースを一括 取得します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  41. 41. 3.7 BeagleBoardへポーティング 41 ・ ソース取得準備 OMAP用のAndroid KernelはBeagleBoardの Androidポーティングで有名なlabs.embinux.orgの ものを使用することにします。 標準のmanifestに含まれていないレポジトリは local_manifest.xmlに追加することで取得できます。 local_manifest.xmlで追加したソースをrepo コマン ド で取得します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  42. 42. 3.7 BeagleBoardへポーティング 42 ・ BootDisk準備 SDカードの起動を行うには,先頭パーティ ションを決まったシリンダ・ヘッド構成でかつ ファイル・システムをvfat(FAT32)にする必要が あります。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  43. 43. 3.7 BeagleBoardへポーティング 43 ・ブート・ローダ準備 パーティション1にブート・ローダ(xloader とu-boot)を格納します。 <格納ファイル> xloarder(MLO) u-boot.bin This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  44. 44. 3.7 BeagleBoardへポーティング 44 ・カーネル準備 BeagleBoard向けのカーネルBuildします。 Buildの前にターゲットに合わせたパッチを適用 します。 <主な修正> ・Bluetooth USBアダプタ This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  45. 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.
  46. 46. 3.7 BeagleBoardへポーティング 46 ・バッテリレスデバイス BeagleBoardはバッテリを持たないため,バッ テリ残量が0%と認識され、Android起動直後に低 バッテリの警告がポップアップします。 これに対応するため,バッテリ・サービスの バッテリ状態の設定処理を修正します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  47. 47. 3.7 BeagleBoardへポーティング 47 ・マウスを有効化 Androidはデフォルトでタッチ・スクリーンと トラック・ボールに対応していますが、ポイン ティング・デバイスに対応しておらず、マウス・ カーソルも表示されません。この為、 Androidで マウス操作を可能にするための修正が必要です。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  48. 48. 3.7 BeagleBoardへポーティング 48 ・マウスを有効化 Androidはデフォルトでタッチ・スクリーンと トラック・ボールに対応していますが、ポイン ティング・デバイスに対応しておらず、マウス・ カーソルも表示されません。この為、 Androidで マウス操作を可能にするための修正が必要となり ます。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  49. 49. 3.7 BeagleBoardへポーティング 49 ・キーレイアウトファイル修正 Androidでは,インプット・デバイスごとに キー・レイアウト・ファイル(Androidのキー名 とキー・コードのマップ・ファイル)を持つこと ができます。デフォルトではエミュレータ用の キー・マップ・ファイル(qwerty.kl)がインス トールされます。このデフォルトのキー・レイア ウト・ファイルはBACK(戻る)が専用ボタンに のみ割り当てられている為、EscキーにもBACKを 割り当てます。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  50. 50. 3.7 BeagleBoardへポーティング 50 ・ initプロセス設定ファイル Androidのinitプロセスが使用する設定ファイル (init.rc)を修正します。 initの“init”トリガのアクションとして,ルー ト・ファイル・システムをread only(ro)で再マウ ントする処理が含まれていますが、この処理は Kernelパニックを引き起こしてしまう為、コメン ト・アウトし、変わりにbootトリガ―を記述しま す。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  51. 51. 3.7 BeagleBoardへポーティング 51 ・ Homeキー有効化 デフォルトでは携帯電話向けに,SIMのアク ティベーションが完了するまで、Homeキーを無 効にする処置を行っています.これに対応するた め,system.propファイルにHomeキーを有効にす るプロパティを設定しておきます。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  52. 52. 3.7 BeagleBoardへポーティング 52 ・ボード構成設定ファイル Androidのビルド・システムは,ターゲットと なるボードに合わせてビルド構成が変更可能なよ うに,ボードごとに構成ファイル (BoardConfig.mk)を持つことができます。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  53. 53. 3.7 BeagleBoardへポーティング 53 ・ボード構成設定ファイル This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  54. 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.
  55. 55. 3.7 BeagleBoardへポーティング 55 ・ Anroidのソース・コードビルド ターゲットボードに合わせた環境にて、Android のソース・コードをビルドを行い、Userlandを構 築します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  56. 56. 3.7 BeagleBoardへポーティング 56 ・ Userlandコピー ビルドが完了以下のフォルダにイメージ・ファイ ルが作成されます。 “~/mydroid/out/target/product/generic” Userlandを構成する個別ファイルをSDカード のパーティション1にコピーし、パーミッション とオーナを変更します。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  57. 57. 4章.開発環境 57This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  58. 58. 4章の概要 58 • 4.1 全体構成 • 4.2 開発環境 • 4.3 beagleboardを動かす準備 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  59. 59. 4.1 全体構成 • ハードウェア構成全体図 59 HDMI RS232C LCD BeagleBoard USB SD 入力切り替え アナログ/ 開発PC ディストリビューション: Ubuntu 10.10 カーネル: 2.6.35 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  60. 60. 4.2 開発環境 • 開発環境構築 組込み用途の開発ツール 1.Ubuntu 2.JDK5(sun-java5-jdk) 3.Eclipse 4.Android Development Tool(Eclipse) 5.Android SDK 6.Android NDK 60This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  61. 61. 4.2 開発環境 • JDKについて Androidに搭載しているDalvikDMはGoogle独自 ただし、独自の開発言語とコンパイラを作ら ず、Javaを選択している。 Android SDKはJavaのバイトコードをDEXコード に変換するトランスコーダを提供している 61This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  62. 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. 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.
  64. 64. 4.2 開発環境 • NDKのメリット 1.既存のソースコードが利用できる (C/C++) 2.Linuxのシステムを直接制御が可能 ※1 3.CPU機能をフルに引き出せる (パフォーマンスを求める処理に向いてい る) 64This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  65. 65. 4.2 開発環境 • NDKの制約 NDKはメリットだけではなく、制約は存在する 1.C++の標準ライブラリ、RTTI,STLが使用でき ない 2.Androidワークフレームが呼び出せない 3.メモリ管理がシビア 4.リソース管理がシビア 5.例外処理ができない 6.NDKで高速化できない場合もある 65This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  66. 66. 4.2 開発環境 • 注意ポイント 制約の中で特に気付けるポイントとして、メ モリ及びリソースの管理が必要。 Javaであればバーチャルマシーンが解放する ので気にする必要はありませんが、C/C++の場合 は開発者が意識する必要がある。 66This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  67. 67. 4.2 開発環境 • 高速化できない理由 JNIの呼出にかかるオーバーヘットが発生。 これはJavaからJNI変換がおこなわれる為で、 呼び出す回数に注意する必要がある。 67This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  68. 68. 4.3 beagleboardを動かす準備 • 開発環境構築 Beagleboard用のカーネルを構築します。 ソースを取得する際のディレクトリを作成しま す ディレクトリ名: TI_Android_GingerBread_2_3_4Sources ※以後、ワーキングディレクトリの起点は特に指定しない限 り”TI_Android_GingerBread_2_3_4Sources” とします。 68 詳細は http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  69. 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.
  70. 70. 4.3 beagleboardを動かす準備 • ソース取得 wgetコマンドを使用し、Androidカーネルソース 一式をダウンロードし取得致します。 70 wget とは、UNIXコマンドラインで HTTP や FTP 経由のファイル取得 を行ツール リンク先を階層で指定して一気に取得することができ、レジューム 機能があり便利です。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  71. 71. 4.3 beagleboardを動かす準備 • パッケージのダウンロード方法。 71 # パッケージのダウンロード $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-software-properties uboot-mkimage -y This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  72. 72. 4.3 beagleboardを動かす準備 72 # JDK6のインストール $ sudo add-apt-repository ‘deb http://archive.canonical.com/ lucid partner’ $ sudo apt-get update $ sudo apt-get install sun-java6-jdk -y • JDK6のダウンロードとインストール方法 Tips: install中に何らかで強制終了した後に再インストールする場合 下記フォルダのゴミを削除します。 /var/lib/dpkg/updates/* This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  73. 73. 4.3 beagleboardを動かす準備 • ソースコードをビルドする際に必要なツールチェーン (クロスコンパイラ)とDevKit向けのツールを導入します。 コンパイラ、リンカなどのBeagleBoard上で動くプログ ラムを作成するためのツール集です。 binutils+gcc+glibc or uclibcなどが含まれます。 73This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  74. 74. 4.3 beagleboardを動かす準備 • ツールチェーン(クロスコンパイラ)とDevKit向けのツールを導入方法。 74 $ mkdir ~/tools $ cd /tmp $ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none- linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 $ tar xvjf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C ~/tools/ $ echo 'export PATH=$PATH:~/tools/arm-2010q1/bin' >>~/.bashrc $ source ~/.bashrc $ 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/Tools.tar.gz $ tar xvzf Tools.tar.gz $ mv Tools/* ~/tools This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  75. 75. 4.3 beagleboardを動かす準備 • ユーザランドのBuild Beagleboard rev C4用のAndroidのユーザランドをビルドする には以下のコマンドを入力します。 ユーザーランドとは ハードウェアを直接管理操作するなどの最も中心的な機能の部分を、特に カーネルと呼ぶケースがあります。この場合、カーネル以外の部分(シェ ルなど)はユーザーランドと呼ばれています。 空間が違う事から、カーネルとユーザーランドではCPUモードやアドレス 空間が異なっています。 75 $ make TARGET_PRODUCT=beagleboard TARGET_BUILD_VARIANT=eng OMAPES=3.x -j4 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  76. 76. 4.3 beagleboardを動かす準備 • ビルドシステムの必須オプション TARGET_PRODUCTとTARGET_BUILD_VARIANTはAndroidのビルドシステム で必須のオプションです。 下記では、makeコマンドに直接オプ ションを渡しています。 事前に必須のビルドオプションを設定する には以下のコマンドを入力します。 ※なおAndroid-GingerBread-2.3.4 DevKitでは、ユーザランドをビルドす るとカーネルも自動的にビルドされます。 76 $ source build/envsetup.sh $ lunch beagleboard-eng # lunch <TARGET_PRODUCT>-<TARGET_BUILD_VARIANT> 形式で指 定 $ make OMAPES=3.x -j4 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  77. 77. 4.3 beagleboardを動かす準備 • Bootプロセスイメージ 77 電源ON ROMプログラム X-Loader U-boot Linuxカーネル Android起動 (init処理) 物理アドレ ス 0x00000000 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  78. 78. 4.3 beagleboardを動かす準備 • X-Loaderビルド beagleboardではbootローダーとして、u-bootを使用します。 X-Loaderは特定のアドレスにプログラムをロードする機能がありま す。 78 $ cd x-loader $ make CROSS_COMPILE=arm-none-linux-gnueabi- omap3beagle_config $ make CROSS_COMPILE=arm-none-linux-gnueabi- $ ~/tools/signGP/signGP x-load.bin $ mv x-load.bin.ift MLO This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  79. 79. 4.3 beagleboardを動かす準備 • 次にU-Bootをビルドします。 U-bootは組込みで良く使用されるオープンソースのboot loader。 ネットワーク接続や環境変数を保持できます 79 $ cd u-boot $ make CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_config $ make CROSS_COMPILE=arm-none-linux-gnueabi- <参考> u-boot から利用可能なアドレス範囲 DDR-SDRAM(64M) 開始:00000000 終了:03FFFFFF 内部メモリマップドI/O領域 開始: F0000000 終了: F000FFFF フラッシュメモリ(8M) 開始: FF800000 終了: FFFFFFFF This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  80. 80. 4.3 beagleboardを動かす準備 • 起動スクリプトファイル作成 U-Boot用の起動スクリプトファイルを作成します 80 $ cd ~/tool/mk-bootscr/ $ ./mkbootscr # boot.scrファイルが作成される This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  81. 81. 4.3 beagleboardを動かす準備 • ファイルシステム設定 SDカードブート起動用にSDカードのパーティションと ファイルシステムを設定します。 PCにSDカードを挿入 し、以下のコマンドを実行します。 81 $ dmesg | tail # SDカードのブロックデバイス名を確認します。 $ export LANG=C $ sudo ./mkmmc-android.sh /dev/sdx # /dev/sdxは各自の環境に合わせて下さい。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  82. 82. 4.3 beagleboardを動かす準備 • ビルド済みのファイルコピー SDカードにビルド済みの以下のファイルをコピーしま す。 1. X-Loaderイメージ 2. U-Bootイメージ 3.カーネルイメージ 4.起動スクリプト 5.Rootファイルシステム ユーザランド(rootfs) 6. Rootファイルシステム ユーザランド(system) 82 $ cp -a x-loader/MLO /media/boot # X-Loaderイメージ $ cp -a u-boot/u-boot.bin /media/boot # U-Bootイメージ $ cp -a kernel/arch/arm/boot/uImage /media/boot # カーネルイメージ $ cp -a ~/tools/mk-bootscr/boot.scr /media/boot # 起動スクリプト $ cp -a out/target/product/beagleboard/rootfs/* /media/rootfs # ユーザランド(rootfs) $ cp -a out/target/product/beagleboard/system/* /media/rootfs/system # ユーザランド (system) This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  83. 83. 4.3 beagleboardを動かす準備 これで起動ディスクとカーネルの準備は完了です。 Beagleboardに電源を投入し、Androidの起動を行います。 83This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  84. 84. 5章.ドライバ開発 5章では簡単なドライバの作成を行います。 GPIOを使用し、LEDの点灯を行うドライバを作成し、開発 の 流れを学びます。 ・現在の実装確認 ・LEDドライバ作成 ・HALの実装 84This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  85. 85. 5章の概要 85 5.1 LEDドライバ 5.2 実装確認 5.3 LEDドライバの作成 5.4 LEDドライバ実習 5.5.Androidでのハードウェアアクセス 5.6 LEDデバイス用のHALのインタフェース 5.7 LEDドライバ向けHALの実装(lights.c) 5.8.LEDドライバ向けHALの実装(Android.mk) 5.9.LEDドライバ向けHALの実装(アクセス権設定) 5.10 LEDドライバ向けHALのBuild 5.11 LEDドライバ向けHALの実装 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  86. 86. 5.1 LEDドライバ • LEDドライバ概要 beagleboardにはユーザーが自由に利用できるLEDが 2つ(user0, user1)が実装されている。 86This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  87. 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. 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. 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.
  90. 90. 5.1 LEDドライバ ・カーネル再Build カーネルコンフィグを変更を適用するには、カーネルを再ビルドする 必要があります。 以下の手順で再Buildを行います 90 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  91. 91. 5.1 LEDドライバ ・LEDドライバの識別子 ドライバを作成する為には識別名やsysfsエントリ名が必要となりま す。 今回はソースファイル「board-omap3beagle.c」に 識別名、エントリ名、点滅トリガ、GPIO番号を追記致します。 91This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  92. 92. 5.2 実装確認 ・現実装確認 【kernel/arch/arm/mach-omap2/board-omap3beagle.c】 92 static struct gpio_led gpio_leds[] = { { .name = "beagleboard::usr0", .default_trigger = "heartbeat", .gpio = 150, }, { .name = "beagleboard::usr1", .default_trigger = "mmc0", .gpio = 149, }, { .name = "beagleboard::pmu_stat", .gpio = -EINVAL, /* gets replaced */ .active_low = true, }, }; LED Classの識別名。 sysfsエントリ名 となる。 LEDを点滅させるトリガー GPIO番号 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  93. 93. 5.2 実装確認 • 現実装確認 プラットフォームデバイス定義と対応するドライバ名を確認します。 93 【kernel/arch/arm/mach-omap2/board-omap3beagle.c】 static struct gpio_led_platform_data gpio_led_info = { .leds = gpio_leds, .num_leds = ARRAY_SIZE(gpio_leds), }; static struct platform_device leds_gpio = { .name = "leds-gpio", .id = -1, .dev = { .platform_data = &gpio_led_info, }, }; 対応するドライバ名(プラットフォームデバ イスに対応するドライバを決定するための キー)。 LED GPIOドライバの名前であ る”leds-gpio”を指定。 プラットフォームデバイスの定義 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  94. 94. 5.2 実装確認 94 static struct platform_device *omap3_beagle_devices[] __initdata = { &leds_gpio, &keys_gpio, &beagle_dss_device, }; platform_add_devices(omap3_beagle_devices, ARRAY_SIZE(omap3_beagle_devices)); プラットフォームデバイスとし て一括登録 • プラットフォームデバイス一括登録 プラットフォームデバイスを一括登録確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  95. 95. 5.2 実装確認 ・leds-gpio.c実装 leds-gpioはプラットフォームドライバの確認。 95 【kernel/ drivers/leds /leds-gpio.c】 static struct platform_driver gpio_led_driver = { .probe = gpio_led_probe, .remove = __devexit_p(gpio_led_remove), .driver = { .name = "leds-gpio", .owner = THIS_MODULE, }, }; ret = platform_driver_register(&gpio_led_driver); leds-gpioはプラットフォームドライ バとして実装されている。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  96. 96. 5.2 実装確認 96 【kernel/ drivers/leds /leds-gpio.c】 ret = platform_driver_register(&gpio_led_driver); static int __devinit gpio_led_probe(struct platform_device *pdev) { struct gpio_led_platform_data *pdata = pdev->dev.platform_data; : for (i = 0; i < pdata->num_leds; i++) { ret = create_gpio_led(&pdata->leds[i], &leds_data[i], &pdev->dev, pdata->gpio_blink_set); : } platform_set_drvdata(pdev, leds_data); } プラットフォームデバイスに対するドライ バが見つかった場合に呼び出されるプロー ブ関数では、引数でプラットフォームデー タを受け取ることができる。 関数create_gpio_led()では、gpioの初期化処 理と、LED Classへの登録を行う。 LED Class として登録されたLEDデバイスは、SYSFSで 制御可能となる。 ・leds-gpio.c実装確認 <続き> This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  97. 97. 5.3 LEDドライバの作成 • BeagleboardにはEXPANSIONヘッダがあり、OMAP Pinを GPIOやI2C機能として利用することで、ペリフェラルデバ イスを拡張することができます。 97This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  98. 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. 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. 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. 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. 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. 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.
  104. 104. 5.4 LEDドライバ実習 104 実 習 【実習1 回答】 【kernel/arch/arm/mach-omap2/board-omap3beagle.c】 static struct gpio_led gpio_leds[] = { { .name = "beagleboard::usr0", .default_trigger = "heartbeat", .gpio = 150, }, { .name = "beagleboard::usr1", .default_trigger = "mmc0", .gpio = 149, }, { .name = "beagleboard::pmu_stat", .gpio = -EINVAL, /* gets replaced */ .active_low = true, }, { .name = "beagleboard::extled", .default_trigger = "default-on", .gpio = 168, }, }; 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); } This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  105. 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. 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.
  107. 107. 5.5.Androidでの ハードウェアアクセス • HALの実装 AndroidはLinuxカーネルのドライバをそのまま利用しデ バイスにアクセスします。 但し、フレームワーク層から ハードウェアを操作するインタフェース(HAL)は固定であ るため、ドライバ毎にHALの実装が必要となります。 107This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  108. 108. 5.5.Androidでの ハードウェアアクセス • HALを含んだレイアー概要 108 Androidプラットフォーム アプリケーション Androidフレームワーク Linuxカーネル ハードウェア アプリケーション ライブラリ/ネイティブ HAL(Hardware Abstruction Layer) This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  109. 109. 5.5.Androidでの ハードウェアアクセス • バックライトの制御 AndroidではLEDデバイスアクセス用のHALインタフェースを利用し て、設定アプリケーション(Settings)からバックライトの制御を行っ ています。 109This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  110. 110. 5.5.Androidでの ハードウェアアクセス • 全体イメージ 110 アプリケーション フレームワーク ライブラリ/ ネイティブ/HAL Linuxカーネル ハードウェア sysfs I/F LEDバックライト ドライバ LED Class フレームワーク LEDバックライト PowerManager Light libandroid_servers.so Settings BrightnessPreference libhardware.so lights.<hardware>.so JNIでアクセス システムコール(open/read/write) HALインタフェース(hardware/lights.h)を実装するライブラリ。 ドライバ毎にHALを実装することにより、上位はデバイスの違 いを意識せずにデバイスにアクセスできる。 LightsService Lightクラスのインスタンス取得 PowerManagerService This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  111. 111. 5.5.Androidでの ハードウェアアクセス • 画面の明るさ制御 OMAP Pin AF15(GPIO168)に接続されたLEDをAndroid標準の設定アプリ (Settings)の「画面の明るさ」から制御するには? HALより上位層ではデバイスの違いを意識しないため、 GPIO168のLED 用のHALを実装すれば良い。 111This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  112. 112. 5.5.Androidでの ハードウェアアクセス • まずソースコード上でバックライトをどのように制御しているかを 確認します。 112 【packages/apps/Settings/src/com/android/settings/BrightnessPreference.java】 public class PowerManager { : public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { setBrightness(progress + MINIMUM_BACKLIGHT); } : private void setBrightness(int brightness) { try { IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); if (power != null) { power.setBacklightBrightness(brightness); } : 「設定」→「表示」→「画面の明 るさ」のシークバーが変更された 場合に呼び出される This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  113. 113. • ソースコード確認<続き> Binder IPCの呼出を確認 次ページへ 5.5.Androidでの ハードウェアアクセス 113 【frameworks/ base/core/java/android/os/PowerManager.java】 public class PowerManager { : public void setBacklightBrightness(int brightness) { try { mService.setBacklightBrightness(brightness); : } : PowerManagerServiceの setBacklightBrightnessメソッドが Binder IPC経由で呼び出される This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  114. 114. • ソースコード確認<続き> Lightクラスのバックライト用のインスタンス確認 5.5.Androidでの ハードウェアアクセス 114 【frameworks/ base/services/java/com/android/server/PowerManagerService.java】 class PowerManagerService extends IPowerManager.Stub implements LocalPowerManager, Watchdog.Monitor { : private LightsService.Light mLcdLight; void init(Context context, LightsService lights, IActivityManager activity, BatteryService battery) { : mLcdLight = lights.getLight(LightsService.LIGHT_ID_BACKLIGHT); : } : public void setBacklightBrightness(int brightness) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); // Don't let applications turn the screen all the way off synchronized (mLocks) { brightness = Math.max(brightness, Power.BRIGHTNESS_DIM); mLcdLight.setBrightness(brightness); } : } : LightsServiceのインナークラスの Lightクラスのバックライト用のイ ンスタンスを取得 LightクラスのsetBrightnessメソッ ドを直接呼び出す This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  115. 115. 5.5.Androidでの ハードウェアアクセス 115 【frameworks/base/services/java/com/android/server/LightsService.java】 public class LightsService { : public Light getLight(int id) { return mLights[id]; } : public final class Light { : public void setBrightness(int brightness) { setBrightness(brightness, BRIGHTNESS_MODE_USER); } public void setBrightness(int brightness, int brightnessMode) { synchronized (this) { int color = brightness & 0x000000ff; color = 0xff000000 | (color << 16) | (color << 8) | color; setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode); } } private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) { if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS) { mColor = color; mMode = mode; mOnMS = onMS; mOffMS = offMS; setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode); } } : private static native void setLight_native(int ptr, int light, int color, int mode, int onMS, int offMS, int brightnessMode); } “native”キーワード付きのネイ ティブメソッドをよびだす This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  116. 116. 5.5.Androidでの ハードウェアアクセス 116 【 frameworks/base/services/jni/com_android_server_LightsService.cpp】 : static JNINativeMethod method_table[] = { { "init_native", "()I", (void*)init_native }, { "finalize_native", "(I)V", (void*)finalize_native }, { "setLight_native", "(IIIIIII)V", (void*)setLight_native }, }; static jint init_native(JNIEnv *env, jobject clazz) { : err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); if (err == 0) { devices->lights[LIGHT_INDEX_BACKLIGHT] = get_device(module, LIGHT_ID_BACKLIGHT); : } else { memset(devices, 0, sizeof(Devices)); } return (jint)devices; } static void setLight_native(JNIEnv *env, jobject clazz, int ptr, int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode) { Devices* devices = (Devices*)ptr; light_state_t state; if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) { return ; } : devices->lights[light]->set_light(devices->lights[light], &state); } メソッドテーブルで、Javaのメソッド をCの関数にマッピング liblights.<hardware>.soがロードされてい ない場合、LEDデバイスのIndexに対応 するLEDデバイスが存在しない場合はこ こで復帰する LightsServiceのコンストラクタで init_nativeメソッドが呼び出され、その 延長のhw_get_module関数内で libligths.<hardware>.soがロードされる get_devieを呼び出し、 LIGHT_ID_BACKLIGHTなどの各LEDデバイ スIDに対応するstruct light_device_t 型の オブジェクトを取得する HAL I/Fのset_lightハンドラをコールバッ クする This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  117. 117. 5.5.Androidでの ハードウェアアクセス 117 struct light_device_t { int (*set_light)(struct light_device_t* dev, struct light_state_t const* state); }; struct hw_device_t { uint32_t tag; uint32_t version; struct hw_module_t* module; uint32_t reserved[12]; int (*close)(struct hw_device_t* device); } common; struct light_device_t { int (*set_light)(struct light_device_t* dev, struct light_state_t const* state); }; struct hw_device_t { uint32_t tag; uint32_t version; struct hw_module_t* module; uint32_t reserved[12]; int (*close)(struct hw_device_t* device); } common; struct light_device_t { int (*set_light)(struct light_device_t* dev, struct light_state_t const* state); }; struct hw_device_t { uint32_t tag; uint32_t version; struct hw_module_t* module; uint32_t reserved[12]; int (*close)(struct hw_device_t* device); } common; struct light_device_t { int (*set_light)(struct light_device_t* dev, struct light_state_t const* state); }; struct hw_device_t { uint32_t tag; uint32_t version; struct hw_module_t* module; uint32_t reserved[12]; int (*close)(struct hw_device_t* device); } common; typedef struct hw_module_t { uint32_t tag; uint16_t version_major; uint16_t version_minor; const char *id; const char *name; const char *author; struct hw_module_methods_t* methods; void* dso; uint32_t reserved[32-7]; } hw_module_t; typedef struct hw_module_methods_t { int (*open)(const struct hw_module_t* module, const char* id, struct hw_device_t** device); } hw_module_methods_t; struct Devices { light_device_t* lights[LIGHT_COUNT]; }; HALではopenハンドラを実装し、 light_device_tのオブジェクト(メ モリ)を確保、メンバの初期化を 行う必要がある hw_get_module() ではdlopen()で共 有ライブラリをロードした後、 dlsym()で共有ライブラリ内 の”HMI”(HAL Module Information)と いうシンボル名を検索し、そのア ドレスを返却する。 HALでは必ずこの”HMI”という名前 のhw_module_tのオブジェクトを 静的に定義する必要がある。 LEDのHALではset_lightハンドラ (LEDを制御する関数)を実装する 必要がある HALではcloseハンドラを実 装し、light_device_tのオブ ジェクトを解放する必要が ある This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  118. 118. 5.6 LEDデバイス用の HALインタフェース • LEDのHALは“hardware/msm7k/liblights”が参考に なります。 これをベースにGPIO168のLED用の HALを実装します。 ソースコードとメイクファ イルは以下の様に配置します。 118 - hardware/ti/omap3/libligths/beagleboard/ ├ Android.mk └ lights.c This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  119. 119. 5.7 LEDドライバ向け HALの実装(lights.c) 119 #include <hardware/lights.h> /* その他のヘッダは省略 */ #define BLPATH "/sys/class/leds/beagleboard::extled/brightness" static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; static int write_int(char const* path, int value) { int fd = open(path, O_RDWR); if (fd >= 0) { char buffer[20]; int bytes = sprintf(buffer, "%dn", value); int amt = write(fd, buffer, bytes); close(fd); return amt == -1 ? -errno : 0; } else return -errno; } static int rgb_to_brightness(struct light_state_t const* state) { int color = state->color & 0x00ffffff; return ((77*((color>>16)&0x00ff)) + (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8; } static int set_light_backlight(struct light_device_t* dev, struct light_state_t const* state) { int err = 0; int brightness = rgb_to_brightness(state); pthread_mutex_lock(&g_lock); err = write_int(BLPATH, (brightness <= 30) ? 0 : 1); pthread_mutex_unlock(&g_lock); return err; } static int close_lights(struct light_device_t *dev) { free(dev); return 0; } static int open_lights(const struct hw_module_t* module, char const* name, struct hw_device_t** device) { if (!strcmp(LIGHT_ID_BACKLIGHT, name)) return -EINVAL; struct light_device_t *dev = malloc(sizeof(struct light_device_t)); memset(dev, 0, sizeof(*dev)); dev->common.tag = HARDWARE_DEVICE_TAG; dev->common.version = 0; dev->common.module = (struct hw_module_t*)module; dev->common.close = (int (*)(struct hw_device_t*))close_lights; dev->set_light = set_light_backlight; *device = (struct hw_device_t*)dev; return 0; } static struct hw_module_methods_t lights_module_methods = { .open = open_lights, }; const struct hw_module_t HAL_MODULE_INFO_SYM = { .tag = HARDWARE_MODULE_TAG, .version_major = 1, .version_minor = 0, .id = LIGHTS_HARDWARE_MODULE_ID, .name = “beagleboard lights module", .author = “ISB TOHOKU CORPORATION", .methods = &lights_module_methods, }; set_lightハンドラの実装 closeハンドラの実装 openハンドラの実装 オブジェクト"HMI"の定義 hardware/hardware.hで以下の様に定 義 #define HAL_MODULE_INFO_SYM HMI ARGBを輝度に変 換 writeシステムコールでLEDドライ バに輝度情報を渡す Sysfsエントリに輝度の値を writeする(設定アプリから渡さ れる値が30~255の範囲ため値 を調整)。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  120. 120. 5.8.LEDドライバ向け HALの実装(Android.mk) 120 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := lights.c LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog LOCAL_MODULE_TAGS := optional LOCAL_MODULE := lights.$(TARGET_PRODUCT) include $(BUILD_SHARED_LIBRARY) ライブラリ名は”lights.beagleboard.so” とする 共有ライブラリとしてビルドする TARGET_BUILD_VARIANTは”optional”を指定 する プレリンクの対象にはし ない LOCAL_XXX変数を初期化 ログ出力する際に必要なライブラリを追 加(今回は未使用) This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  121. 121. 5.9.LEDドライバ向け HALの実装(アクセス権設定) • LEDドライバのsysfsエントリは前述のとおり、オーナー/グループの設定 がroot/rootとなっているため、このままではフレームワーク層のサービ ス(UID/GUID=system/system)からアクセスすることができません。 デバイスノードやsysfsエントリのアクセス権を設定するには、 ueventd.<hardware>.rcを変更する必要があります。 ※ sysfsエントリのアクセス権設定は他のデバイスノード等の設定と異なっていることに注意してください。 121 【device/ti/beagleboard/ueventd.omap3.rc】 /dev/cmem 0666 root root /dev/dsplink 0666 root root /dev/lpm0 0666 root root /dev/sdma 0666 root root /sys/devices/platform/leds-gpio/leds/beagleboard::extled brightness 0660 system system 対象のエントリが存在するディレクトリのフルパス 対象のエントリ パーミッション オーナー グループ This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  122. 122. 5.10 LEDドライバ向け HALのBuild • 以下の手順で作成したLED HALのライブラリをビルド(モジュールビ ルド)します。 122 $ source build/envsetup.sh $ lunch beagleboard-eng $ mmm hardware/ti/omap3/liblights/beagleboard # mmmはenvsetup.shのシェル関数。以下のようにmmを使用することも可能 # cd hardware/ti/omap3/liblights/beagleboard/ # mm This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  123. 123. 5.11 LEDドライバ向け HALの実装 • SDカードにビルドしたLED HALライブラリ(lights.beagleboard.so)と、 ueventd.omap3.rcをコピーします※。 123 $ cp out/target/product/beagleboard/system/lib/hw/lights.beagleboard.so /media/rootfs/ system/lib/hw/lights.beagleboard.so $ cp device/ti/beagleboard/ueventd.omap3.rc out/target/product/beagleboard/root/ $ cp out/target/product/beagleboard/root/ueventd.omap3.rc /media/rootfs/ ※ ueventd.omap3.rcは全体ビルドによってout配下にコピーされますが、簡略化のため手動でout配下とSDカードにコピーしま す。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  124. 124. 5.11 LEDドライバ向け HALの実装 • Androidを起動させ、設定アプリから「表示」→「画面の 明るさ」を実行しLED HALの動作確認をします。 • シークバーを最小にすると、LEDが消灯、それ以外は点 灯することを確認します。 124This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  125. 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. 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. 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. 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. 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. 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. 131. 5.12 Android HAL層 • Android HALでの注意点 ドライバに特殊な技術を実装した場合、ソース公開に より 読み取られる場合がある。 技術隠ぺいの為、特殊なアルゴリズムはユーザー空間 側に 置く事ができるが、パフォーマンスを重視する場合は 注意する必要がある。 131This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  132. 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. 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. 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. 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. 136. 6.GPIOドライバ • 6章はBeagle Board のLEDをコントロールするGPIOドライ バを開発します。 6章の進め方は配布したソースコードの内容を確認し、 モジュールをビルドしながら実習を進めて行きます。 136This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  137. 137. 6.GPIOドライバ ・GPIOとは General Purpose Input/Output(汎用入出力)の略語。 電気回路等の部分からデジタル信号を読み取り、出力 と して他デバイスの制御や信号の通知を行う事ができる。 GPIOは特定の用途や信号が決まっておらず、ソフト ウェア の実装によって入出力に利用できる。 137This material is licensed under the Creative Commons License BY-NC-SA 4.0. Copyright 2012, Open Embedded Software Foundation, All rights reserved
  138. 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
  139. 139. 6.GPIOドライバ ・ドライバファイル構成 . |-- device/ | `-- ti/ | `-- beagleboard/ | `-- bb_ext_gpio_test/ | |-- Android.mk | |-- bb_ext_gpio.h | `-- bb_ext_gpio_test.c `-- kernel/ |-- arch/ | `-- arm/ | `-- mach-omap2/ | `-- board-omap3beagle.c `-- drivers/ `-- misc/ |-- Kconfig |-- Makefile |-- bb_ext_gpio.c `-- bb_ext_gpio.h 139This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  140. 140. 6.GPIOドライバ • コンフィグを有効化 Spaceキーを押下し、対象のコンフィグを有効化します。 140 Device Drivers ---> [*] Misc devices ---> [*] beagleboard extended gpio driver $ cd kernel $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  141. 141. 6.GPIOドライバ 141 • カーネルビルド カーネルをビルドし、カーネルイメージをSDカードにコピーします。 $ 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.
  142. 142. 6.GPIOドライバ • 以下の手順で作成したGPIOドライバのテストプログラムをビルド (モジュールビルド)します。 142 $ source build/envsetup.sh $ lunch beagleboard-eng $ mmm device/ti/beagleboard/bb_ext_gpio_test # mmmはenvsetup.shのシェル関数。以下のようにmmを使用することも可能 $ sudo cp out/target/product/beagleboard/system/xbin/bbioctl /media/rootfs/system/xbin/. This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  143. 143. 6.GPIOドライバ 143 実 習 【実習2 回答確認】 • シリアルコンソールからコマンド操作で、実装したGPIOドライバが 正しく動作するかどうかを確認します。 # cd /system/xbin/ # テストプログラムを実行する # bbioctl cmd=?[1,2,3,4,5,6,q] # 例えば、 6 = GPIO_168 (24PIN) 6 arg=?[0,1] # 0=Low, 1=High 1 ioctl((0x3, 0x40bb_ext_gpio_ioctl(cmd=40047e05, arg=0001) 047e05, 0x1) ret=0 cmd=?[1,2,3,4,5,6,q] # 終了する場合は "q" q quit # This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  144. 144. 7.USB無線LANアダプタのポーティング • 市販のUSB無線LANアダプタをAndroid向け にポーティングします。 • 4章で準備したAndroidのソースコードに USB無線LANアダプタを有効にする変更を 加え、Androidへのネットワーク機器のポ ーティング方法を学習します。 144This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  145. 145. 7.USB無線LANアダプタのポーティング 145 • Androidの無線LANデバイス機器の制御はWPA Supplicant (IEEE802.1Xに 準拠した認証を実現するソフトウェア)を利用して実現されています。 アプリケーション フレームワーク ライブラリ/ ネイティブ/HAL Linuxカーネル ハードウェアUSB無線LAN アダプタドライバ USB無線LAN アダプタ WifiManager WifiNative WiFiSettings WifiEnabler libhardware_legacy.solibwpa_client.so WiFiStateTracker WifiService Wireless Extension wpa_supplicant USBホストコントローラドラ イバ dhcpcd Network Device I/F WifiMonitor libandroid_runtime.so NetworkUtils libcore XXXアプリ WiFiのHALを実装するライブラ リ。 ドライバに合わせて実装 する必要がある。 java.net.Socket や java.net.ServerSocket 等の Network I/Fを使用するAPI insmod/rmmod ifconfig/send/recvWEXT command This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  146. 146. 7.USB無線LANアダプタのポーティング 146 • PLANEX社製USB無線LANアダプタ「GW-USNano2」は、Realtec社製の 「RTL8192CU」という無線チップが使用されています。 「RTL8192CU」のドライバおよびHALの実装をRealtec社からダウン ロードすることができます。 http://www.realtek.com/products/productsView.aspx?Langid=1&PNid=21&PFid=48&Level=5&Conn=4&ProdID=274 ※2011/11/16現在、上記URLからダウンロードしたものをそのまま適 用すると、Androidが起動できなくなる現象が確認されています。 この問題を解消したアーカイブファイルおよびパッチファイルを用意 しましたので、本トレーニングではこれを適用することとします。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  147. 147. 7.USB無線LANアダプタのポーティング 147 【RTL8192CU 向けHALの実装の導入】 以下の手順でアーカイブファイル(realtek_wifi_SDK_for_android.tar.gz)を展開しま す。 # realtek_wifi_SDK_for_android.tar.gzは予め/tmpに配置してあることとします。 $ cd TI_Android_GingerBread_2_3_4Sources $ tar xvzf /tmp/realtek_wifi_SDK_for_android.tar.gz 【RTL8192CU 向けドライバの導入】 以下の手順でカーネルにパッチファイル(realkernel-rtl8192cu.patch)を適用します。 # realkernel-rtl8192cu.patchは予め/tmpに配置してあることとします。 $ cd TI_Android_GingerBread_2_3_4Sources/kernel $ patch -p1 < /tmp/realkernel-rtl8192cu.patch This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  148. 148. 7.USB無線LANアダプタのポーティング 148 【RTL8192CU 向けのビルド設定】 WiFiのHALの実装をAndroidのシステムに導入するには、ボード構成設定ファイル (BoardConfig.mk)を修正する必要があります。 【device/ti/beagleboard/BoardConfig.mk】 # ファイル先頭付近に以下を追加します。 BOARD_USES_REALTEK_WIFI := true WPA_SUPPLICANT_VERSION := VER_0_5_X BOARD_WPA_SUPPLICANT_DRIVER := WEXT WIFI_DRIVER_MODULE_PATH := /system/wifi/8192cu.ko WIFI_DRIVER_MODULE_NAME := 8192cu ← RTL8192CU 向けHALのビルド指 定 ← WPA Supplicantのバージョン指 定 ← WPA Supplicantの使用するドライバのI/F(Wireless Extension)を指 定 ← RTL8192CU のドライバモジュールのパスを指 定 ← RTL8192CU のドライバモジュール名を指定 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  149. 149. 7.USB無線LANアダプタのポーティング 149 【device/ti/beagleboard/wpa_supplicant.conf】 # 以下の内容で新規に作成します。 update_config=1 ctrl_interface=DIR=/data/misc/wifi/wpa_supplicant GROUP=wifi ap_scan=1 【WPA Supplicantの設定ファイルの準備】 WPA Supplicantはドライバ毎に設定を変更する必要があります。 RTL8192CU向けに設定ファイル(wpa_supplicant.conf)を用意し、ビルド 時にoutディレクトリ配下にコピーされるようにボードメイクファイ ル(AndroidBoard.mk)を修正します。 【device/ti/beagleboard/AndroidBoard.mk】 # ファイル末尾付近に以下を追加します。 PRODUCT_COPY_FILES += $(LOCAL_PATH)/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf endif This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  150. 150. 7.USB無線LANアダプタのポーティング 150 【init設定ファイルの修正】 wpa_supplicantやdhcpcdをAndroidのサービスとして登録するために、init設定ファ イル(init.rc)を修正する必要があります※。 【device/ti/beagleboard/init.rc】 # 競合する不要なサービスを無効化します。 #service wlan_loader /system/bin/wlan_loader -n # -f /system/etc/wifi/firmware.bin # -i /system/etc/wifi/tiwlan.ini # disabled # oneshot #service btpwr /wl1271bt_enable /dev/ttyS1 # disabled # oneshot #service wpa_supplicant /system/bin/wpa_supplicant -Dtiwlan0 -itiwlan0 -c/data/misc/wifi/wpa_supplicant.conf -dd # socket wpa_tiwlan0 dgram 660 wifi wifi # disabled # oneshot #service dhcpcd /system/bin/dhcpcd -ABKL tiwlan0 # disabled # oneshot ※本来はinit.omap3.rcを修正するのが適切ですが、本トレーニングで使用するTI-Android-GingerBread-2.3.4-DevKit-2.1では、ビルド時に当該 ファイルがout配下にコピーされないため、init.rcを修正しています。 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  151. 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. 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. 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.
  154. 154. 8.Tablet連携 • 8章はTabletをコントローラーとして、LEDの点灯操作します。 6,7章で作成したドライバとアプリケーション連携を行い、 Donkyを操作します。 8章の進め方は配布したソースコード、完成モジュールを利 用しながら 進めて行きます。 154This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  155. 155. 8.Tablet連携 • 全体イメージ 155 Wi-fi コントロールアプリ ケーション実装 Wi-fiからデータを 受け取るサービス を実装 GPIOポート でLEDコントロー ル This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  156. 156. 8.Tablet連携 • 機能概要 – BeagleBoardとTableは、Wi-Fiで接続する – BeagleBoard • Socket通信のサーバーサービスを自動実行する – タブレット : Socket通信のクライアント • IPアドレスを指定し、 GPIOポートへ信号を送信す る 156This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  157. 157. 8.Tablet連携 • BeagleBoard側の作業 – LEDドライバのポーティング(6章参照) – Socket通信用サーバーアプリの導入 • タブレット側の作業 – Socket通信用クライアントアプリの導入 157This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  158. 158. 8.Tablet連携 • 起動用SDカードの作成 158 カーネルイメージのコピー (※ビルド済のファイルは、/media/userdata/android/training/08_tablet/complete/ に収録しています) # cd /media/userdata/android/training/08_tablet/complete/ # sudo cp -p boot/uImage /media/boot/. rootfsの展開 # sudo tar xfv wifi_rootfs.tar.gz -C /media/rootfs/. syncコマンドでバッファの内容を書き込みます # sync This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  159. 159. Socket Server 8.Tablet連携 • Androidアプリの仕様概要 159 タブレットBeagleBoard Wi-Fiルー タ ※IPアドレスは、ルータのDHCPからリース ※別途Wi-Fiのパスワード設定が必要 8080 port Andoird App GPIO HAL GPIO Device This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  160. 160. 8.Tablet連携 • SocketSeverサービスの実装① • バックエンドで処理させるAndroidのサービスとして実装します • システム起動時に自動開始させるため、 BroadCastReceiver を作成し、システムのブ ロードキャスト BOOT_COMPLETEDを受け取り、サービスを開始します • システムからBOOT_COMPLETEDを受けるためには、 AndroidManifest.xml にパーミッシ ョンの設定が必要です。 160 【 AndroidManifest.xml 】 <receiver android:name=".receiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> ・・・ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  161. 161. 8.Tablet連携(Wi-Fi) 161 • SocketSeverサービスの実装② • Androidサービスから、JNIを利用してGPIOポートへアクセスします。 WifiOnOffReceiver.java TCPServer.java libbb_ext_gpio_test.so サービス開始トリガー /dev/bb_ext_gpio JNI デバイスopen This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  162. 162. 8.Tablet連携(Wi-Fi) 162 • SocketSeverサービスの実装② • サービスから直接デバイスにアクセスするので、デバイスのパーミッションを変更 します。 【device/ti/beagleboard/ueventd.omap3.rc】 /dev/bb_ext_gpio 0666 root root This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  163. 163. 8.Tablet連携(Wi-Fi) • Androidアプリのビルド Androidアプリは、一般的に統合開発環境のEclipseを利用して開発を行います。 JNIを利用する場合は、Android-SDKの他に、Android-NDKをインストールします 。 163 Android-SDKのインストール # wget http://dl.google.com/android/android-sdk_r15-linux.tgz # tar xvf android-sdk_r15-linux.tgz Android-NDKのインストール # wget http://dl.google.com/android/ndk/android-ndk-r7-linux-x86.tar.bz2 # tar xvf android-ndk-r7-linux-x86.tar.bz2 ~/.bashrc にパスを追加します export PATH=$PATH:/media/userdata/android/android-sdk-linux_x86/platform-tools:/media/userdata/android/android-sdk- linux_x86/tools/media/userdata/android/android-ndk-r7 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  164. 164. 8.Tablet連携(Wi-Fi) • Andoirdアプリのインストール① PCとBeagleBoardをUSBケーブルで接続します 164 カーネルイメージのコピー (※ビルド済のファイルは、/media/userdata/android/training/07_wifi/complete/ に収録しています) # cd /media/userdata/android/training/07_wifi/complete/ adb コマンドで、アプリパッケージをインストールします # adb install SocketServerApp.apk アンインストールの場合は、パッケージ名を指定します # adb uninstall jp.co.isb.itc.android.training.SocketServer This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  165. 165. 8.Tablet連携(Wi-Fi) • Andoirdアプリのインストール② PCとタブレットをUSBケーブルで接続します 165 カーネルイメージのコピー (※ビルド済のファイルは、/media/userdata/android/training/07_wifi/complete/ に収録しています) # cd /media/userdata/android/training/07_wifi/complete/ adb コマンドで、アプリパッケージをインストールします # adb install SocketClientApp.apk アンインストールの場合は、パッケージ名を指定します # adb uninstall jp.co.isb.itc.android.training.SocketClient This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  166. 166. 8.Tablet連携(Wi-Fi) • BeagleBoardのWi-Fi準備 • SDカード、シリアルケーブル、無線LANアダプタを装着し、電源を入れま す。 • 無線LANアダプタは、下図のUSBホストに直接装着します。バスパワーの USBハブ経由で接続すると電力不足により動作しない場合があります。 166This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  167. 167. 8.Tablet連携(Wi-Fi) • IPアドレスの確認 • シリアル端末から、BeagleBoardのIPアドレスを確認します。 wlan0 が無線LANのIPアドレスになります 167 # netcfg lo UP 127.0.0.1 255.0.0.0 0x00000049 wlan0 UP 192.168.1.33 255.255.255.0 0x00001043 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  168. 168. 8.Tablet連携(Wi-Fi) • タブレットからの操作 • インストールしたSocketClientApp を開始して、IPアドレスを指定します • 各ボタンをタップすると、BeagleBoardの該当するGPIOポートの 出力が操作できます ※画面UIはモーター制御をイメージしていますが 実習ではLED点灯で制御を確認します。 168 タブレット BeagleBoard アプリ Expansion Header GPIOポート 右 停止 18 GPIO_159 右 低速 19 GPIO_131 右 高速 20 GPIO_156 左 停止 21 GPIO_130 左 低速 23 GPIO_183 左 高速 24 GPIO_168 This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  169. 169. 8.Tablet連携(Wi-Fi) • タブレットでBeagle Boardを操作してみま しょう Wi-fi経由でLEDの点灯が確認できます。 169This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  170. 170. 8.Tablet連携(Wi-Fi) • <応用> タブレット側の操作をボタンではなく、 3軸センサーでコントロール。 BeagleBoard 側のGPIOでモーター制御を 行えは簡単なラジコン操作も可能 170This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  171. 171. まとめ • まとめ 1.Android とは 2.Androidの概要 3.BeagleBoardへのポーティング 4.開発環境 5.ドライバ開発概要 171This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  172. 172. まとめ • まとめ 5. ドライバ開発概要 6. LED(GPIO)ドライバ 7. 無線LANドライバ 8. BeagleBoardとタブレットの連携 172This material is licensed under the Creative Commons License BY-NC-SA 4.0.
  173. 173. 173 本ドキュメントは株式会社アイエスビー東北が作成しています。 http://www.isb.co.jp This material is licensed under the Creative Commons License BY-NC-SA 4.0. Contributed By:
  174. 174. End of Document 174 This material is licensed under the Creative Commons License BY-NC-SA 4.0.

×