ET2009自分メモ:Android向けデバイスドライバを開発する際のキモ(佐藤 勝彦 氏)
Android向けデバイスドライバを開発する際のキモ
佐藤 勝彦 氏
日本Androidの会/(株)ユビラボ 代表取締役
http://www.ubilabo.net/index.html
組み込み技術者にはめちゃめちゃ参考になる話でした。
もっと聞いていたかった!
会社紹介
東京工科大ケータイにAndroidを移植
導入実績
- Armadillo, Omap , WS003/007/011/020SH
- Touch Diamond / Touch Pro / SnapDragon
- Netwalker
Driver開発
Android にはKernelの間に、HALがある
- Linuxドライバは通常の手順で。
Android特有のドライバ
LGPL/GPKライセンス上はグレー?
- AndroidのHAL
- Audio Radio Interface Layer
- Sensor
- Video , Camera
- Wifi
ここはApacheライセンス
ドライバ一覧
Binder / Logger / RAM Console / Timed_output / LowMemoryKiller / Pmem / 電源管理周り(Power_supply)
Binder
- IPCの実現に利用されている。
OpenBinderを変更(miscドライバになっている)
- Androidでは、ServiceManagerにて利用
プロセス間通信で利用
- IBinderインターフェイス、MediaPlayerService
- Framework/base/cmd/servicemanager
- ネイティブのサービス間通信
アンドロイド Java層のサービス間通信
AIDLファイルからBinder用のスタブが自動生成
Logger
- カーネルにてデバイスノードを作成
/dev/log_main
/dev/log_events
/dev/log_ragio
system/core/liblog配下にログ書き込み用ライブラリ
Logcatのコマンドによってどのログファイルを呼び出すか、決める
RAM Console
シリアルポートを使えない、使うのが難しい場合に利用
WindowsMobile端末へのポーティング
メモリ上にprintkができる。
カーネルパニック時:
- リブート後にリブート前のログがメモリに残っていればリブート後にもログが取得できる
- 物理メモリのアドレスを指定できる
Timed_Output
LowMemoryKiller
- メモリが少なくなったときにプロセスをKILLする仕組み
- プロセスを指定してKILL対象から外す事が可能。優先度を決める事もできる
アンドロイドでは
- アプリケーション全般に適応
- メモリが少なくなった際は、自動的にアプリケーションがKILLされる
フロントアプリケーション、HOMEアプリケーション、サービスアプリケーションの順で優先度が高い
onExistなど終了処理があるが、終了コマンドを必ず通る訳ではない。
カーネルから勝手にKILLされるため。
init.rcにて優先度を書かれている(KILL対象の範囲を確認できる)
pmem
決められた物理アドレスをユーザプログラムからアクセス
mallocのような複数のメモリを確保する方法
メモリ全体を確保する方法
アンドロイドでは
利用しているユーザプログラム
- GPU (OpenGL)グラフィックアクセラレーション
- ADPS(OpenMax)、メディアプレーヤーで利用するエンコーダ/デコーダ
- Camera用バッファ
- HALレイヤーで実装するとGPLライセンスに引っかからないので、
pmem+サービスアプリケーションで提供する
ashmem
ソースの場所
/kernel_root/mm/ashmem.c
/dev/ashmem
システム用のプロパティで利用
setprop/getpropこまんどで利用している
このドライバがない場合は、利用せず、ファイルをつかう実装が提供されている
アンドロイドのHAL
LibHardware HAL用のモジュールを作成するためのライブラリ
Libhardware_legacy
RIL/Audio
サービスnativeアプリからsoファイルをインポート
HALを駆使すれば、GPS・コンパスシミュレータが可能
移動シミュレーションが可能
⇒エミュレータで開発する場合に有用(ゆびらぼさんでやった)
最後に
組み込みワーキンググループのメーリングリストがあるらしい