[android-group-japan: 4143] センサについて教えてください

712 views
Skip to first unread message

Hasegawa

unread,
May 16, 2010, 9:56:14 PM5/16/10
to 日本Androidの会
はじめまして、長谷川と申します。
Andoroidのアプリケーション開発の経験はあるのですが、ボードへのポーティング等は初心者です。

今回、アットマークさんのArmadillo440にAndroidを載せました。ネットにある情報の手順のまま。AndroidはEclair
(2.1_r2)
おかげさまでAndroidの2.1が無事動きました。

そしてこのボードに各種センサをつなぎたいのです。秋月で購入した加速度センサをI2Cで接続しました(440のI2C-1に)。
linux-2.6.26-at7では二番目のI2C(I2C-1)が有効になっていなかったので、カーネルを440のI2C-1を有効にして再構築し
ました。
そしてI2Cを直接読む簡単なLinuxアプリを作成し、正常にセンサから値は読み取れることを確認できました。

やりたいのは、このセンサの値をAndroidのSensorManagerクラスに渡したいのです。
sensor.default.so等を作成して/system/lib/hw/以下に置けばよいというのはなんとなくわかったのですが、なにぶん
Android.mkの書式さえよくわからない状況でどこから手をつければよいのかわかってません。

やったのは
/htc/dream/sensor/sensor.c Android.mkを参考にして、
/hardware/libhardware/sensors/sensors.c と Android.mkを作りました。

sensor.cは単純にpoll内で直接I2Cから値を読んでdev->sensors[]につめてます(これでいいのかって疑問もありますがとりあ
えずあとまわし)。


ご教授いただきたいのは、sensor.default.soの作り方なんです。恥ずかしいことにここからわかっていません。
sensorsディレクトリに置いたAndroid.mkは以下のとおりです。

ifeq ($(TARGET_PRODUCT),a440)
# HAL module implemenation, not prelinked and stored in
# hw/<SENSORS_HARDWARE_MODULE_ID>.<ro.product.board>.so
# Setting LOCAL_PATH will mess up all-subdir-makefiles, so do it
beforehand.
#SAVE_MAKEFILES := $(call all-subdir-makefiles)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES := liblog libcutils
LOCAL_SRC_FILES := sensors.c
LOCAL_MODULE := sensors
#include $(SAVE_MAKEFILES)
include $(BUILD_SHARED_LIBRARY)
endif

make実行すると、
build/core/shared_library.mk:20: *** hardware/libhardware/sensors:
Illegal use of OVERRIDE_BUILT_MODULE_PATH.
というエラーメッセージが表示されます。
これは何処かとモジュール名が重複しているのかと思ったのですがちょっとわかってません。

ちなみに/libhardware/sensors/ディレクトリのない状態でmakeすると、
/system/lib/hw/にはsensors.goldfish.soというモジュールができてます。エミュレータ用?

ソース取得したルートのbuildspec.mkには
TARGET_PRODUCT:=a440
と記述してます。


1.センサモジュール用のソースコードは/hardware/libhardware/sensorsにおけばよいのか?またはそのしたの/
modulesのとこ?何処でもよいのか??
2.Android.mkの記述方法とか、このsensor.cを使うなにかおまじない等
3.作成したモジュールは/lib/hwに置いておけばAndroidが勝手にロードしてくれるの?
4.その場合、ロードしてくれるように何処かへ記述が必要なのか?

だいたいこのあたりがわかってません。。
ディレクトリ構成からmakeの仕組みまでを理解してないのに無謀なのかもしれません。。。

みなさまのアドバイスを頂きたく、よろしくお願いいたします。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

sola

unread,
May 18, 2010, 11:06:29 AM5/18/10
to android-g...@googlegroups.com
長谷川さんへ

はじめまして、sola と申します。

昨年Armadillo-500FXやBeagleBoardで確認したものです。
Armadillo-440はコンパイル確認のみですが、参考になれば。


■ファイルの格納場所

私は以下に置きました。
ファイル構成は同じかと思います。
sola@sola_dolphin_1:~/Android/Armadillo-440/android-2.1_r2/hardware/libhardware/modules/sensors$ ls
Android.mk  sensors.c


■Android.mk の内容

Android.mk は、以下のように書いてます。
---ここから---
LOCAL_PATH:= $(call my-dir)

# HAL module implemenation, not prelinked and stored in
# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.so
include $(CLEAR_VARS)

LOCAL_SRC_FILES := sensors.c


LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

LOCAL_SHARED_LIBRARIES := \
    liblog \
    libcutils

LOCAL_MODULE := sensors.armadillo-440

include $(BUILD_SHARED_LIBRARY)
---ここまで---


■ビルド方法

以下のようにビルドすれば、インストールまでされます。
格納先は、
out/target/product/a440/system/lib/hw/sensors.armadillo-440.so
となってます。

sola@sola_dolphin_1:~/Android/Armadillo-440/android-2.1_r2$ source build/envsetup.sh
sola@sola_dolphin_1:~/Android/Armadillo-440/android-2.1_r2$ cd hardware/libhardware/modules/sensors/
sola@sola_dolphin_1:~/Android/Armadillo-440/android-2.1_r2/hardware/libhardware/modules/sensors$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=a440
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ERE27
============================================
make: ディレクトリ `/home/sola/Android/Armadillo-440/android-2.1_r2' に入ります
Copy: out/target/product/a440/system/etc/apns-conf.xml
target Non-prelinked: sensors.armadillo-440 (out/target/product/a440/symbols/system/lib/sensors.armadillo-440.so)
Install: out/target/product/a440/system/lib/hw/sensors.armadillo-440.so
make: ディレクトリ `/home/sola/Android/Armadillo-440/android-2.1_r2' から出ます


■ロードする方法

ロードはシステム起動時に実行されます。
何をロードするかは名前で見ています。
sensors.armadillo-440.so
これの、「armadillo-440」の部分で判断。

Armadillo-440 のソースだと、以下に名前の定義があります。
arch/arm/mach-mx25/armadillo400.c
ここを変更すれば、別の名前にも出来ます。

以下のコマンドでも確認できます。
# cat /proc/cpuinfo
~途中略~
Hardware        : Armadillo-440
Revision        : 0300
Serial          : 0000000000000000

確か、この辺の情報を読み込んで、どの .so をロードするか見ているはずです。


2010年5月17日10:56 Hasegawa <hasegaw...@gmail.com>:

Tsuneo Hasegawa

unread,
May 18, 2010, 11:50:04 PM5/18/10
to android-g...@googlegroups.com
solaさん
はじめまして、長谷川です。
今回440にAndroidを載せるにあたって貴ブログを参考にさせて頂きました。
この場をお借りしてお礼申し上げます。

アドバイス頂いた内容を元に以下のとおり修正いたしました。

・sensors/の場所を変更
変更前:hardware/libhardware/sensors/
変更後:hardware/libhardware/modules/sensors/

・Android.mkのLOCAL_MODULE
変更前:LOCAL_MODULE := sensors
変更後:LOCAL_MODULE := sensors.armadillo-440

この変更で無事 sysytem/lib/hw/sensors.armadillo-440.so ができました。ありがとうございます。

いまはまだsensors.cの各関数は雛形だけでセンサ値を返していないのでちゃんと動いているのか判断しかねますが、一番悩んでいた部分が解決できました。
ほんとうにありがとうございました。



2010年5月19日0:06 sola <sola....@gmail.com>:

daisougen

unread,
May 19, 2010, 12:54:01 PM5/19/10
to 日本Androidの会
daisougenです。
こんにちわ。

横ですが、、
> sensor.cは単純にpoll内で直接I2Cから値を読んでdev->sensors[]につめてます(これでいいのかって疑問も
> ありますがとりあえずあとまわし)。

加速度センサのドライバを独立してつくって、その中でi2cからデータを読み、input_report_abs()等でinputに渡すのが一般的か
と思います。そうするとgetevent等のコマンドでデータを眺めたりできます。
ご参考まで。

On May 18, 10:50 pm, Tsuneo Hasegawa <hasegawa.tsu...@gmail.com>
wrote:
> solaさん
> はじめまして、長谷川です。
> 今回440にAndroidを載せるにあたって貴ブログを参考にさせて頂きました。
> この場をお借りしてお礼申し上げます。
>
> アドバイス頂いた内容を元に以下のとおり修正いたしました。
>
> ・sensors/の場所を変更
> 変更前:hardware/libhardware/sensors/
> 変更後:hardware/libhardware/modules/sensors/
>
> ・Android.mkのLOCAL_MODULE
> 変更前:LOCAL_MODULE := sensors
> 変更後:LOCAL_MODULE := sensors.armadillo-440
>
> この変更で無事 sysytem/lib/hw/sensors.armadillo-440.so ができました。ありがとうございます。
>
> いまはまだsensors.cの各関数は雛形だけでセンサ値を返していないのでちゃんと動いているのか判断しかねますが、一番悩んでいた部分が解決できました。
> ほんとうにありがとうございました。
>
> 2010年5月19日0:06 sola <sola.198...@gmail.com>:
> > 2010年5月17日10:56 Hasegawa <hasegawa.tsu...@gmail.com>:

RYO IKUYAMA

unread,
May 19, 2010, 6:12:38 PM5/19/10
to android-g...@googlegroups.com
いくやまと申します。便乗質問です。

> 加速度センサのドライバを独立してつくって、その中でi2cからデータを読み、input_report_abs()等でinputに渡すのが一般的か
> と思います。そうするとgetevent等のコマンドでデータを眺めたりできます。
> ご参考まで。

私もいま同じ様なところで悩んでます。
当MLの過去ログで「poll内で直接I2Cから読んでもOK」というディスカッションをみつけたので、同じ様にpollでI2Cから読む形でsensors.cを書いてます。
data__openでI2Cオープンと初期化、data__pollでセンサ値読み込み、data__closeでI2Cのクローズとして、他の関数(control__open等)は何もしないでreturn
0

結果、Androidの起動が非常に遅くなりました。ログを確認したところ、pollしまくってます。
ポーリング間隔が狭すぎなのか、必要ないときにはdisableにするのか?そしてその方法は?

SensorManagerから値を読んで表示するだけのアプリを作成して動かしたところ、非常に重たいながらもそれらしき値を表示できたのですが、いかんせん重すぎでほとんとフリーズしてしまいます。

htc dreamのsensors.cとincludeのsensors.hを参考にしてます。
あとこのサイトが参考になりました→ http://jollen.org (chromeの翻訳機能大活躍)
アドバイスやヒント等いただけたら助かります。
またなにか参考になるソースやサイトがありましたら教えていただきたく。

見様見真似でやってますが知識無しで情報も少なくて難儀してます。
宜しくお願いいたします。



2010/5/20 daisougen <daisoug...@yahoo.com>:

daisougen

unread,
May 20, 2010, 12:48:59 PM5/20/10
to 日本Androidの会
daisougenです。

独立したドライバを作ってinputを介す利点は一般的に次の3点かと思います。

1. ポーリング間隔の制御:ポーリングを要するデバイスの場合、ドライバからschedule_delayed_work()を使うことで(ある程
度)正確に一定の間隔でデータを取れます。
2. データの加工:例えば、ドライバが同じ値のデータを連続して投げ続けても、重複したデータがフィルタリングされますので、その分アプリの
onSensorChanged()が呼ばれる回数が減り、システム全体が軽くなるはずです。
3. デバイス固有の電源管理:ドライバ側にsuspend/resumeハンドラを持つことでデバイス毎に最適化した電源管理が実装できます。

ざっと思いつくのはこんなところでしょうか。

On May 19, 5:12 pm, RYO IKUYAMA <r.ikuy...@gmail.com> wrote:
> いくやまと申します。便乗質問です。
>
> > 加速度センサのドライバを独立してつくって、その中でi2cからデータを読み、input_report_abs()等でinputに渡すのが一般的か
> > と思います。そうするとgetevent等のコマンドでデータを眺めたりできます。
> > ご参考まで。
>
> 私もいま同じ様なところで悩んでます。
> 当MLの過去ログで「poll内で直接I2Cから読んでもOK」というディスカッションをみつけたので、同じ様にpollでI2Cから読む形でsensors.cを書いてます。
> data__openでI2Cオープンと初期化、data__pollでセンサ値読み込み、data__closeでI2Cのクローズとして、他の関数(control__open等)は何もしないでreturn
> 0
>
> 結果、Androidの起動が非常に遅くなりました。ログを確認したところ、pollしまくってます。
> ポーリング間隔が狭すぎなのか、必要ないときにはdisableにするのか?そしてその方法は?
>
> SensorManagerから値を読んで表示するだけのアプリを作成して動かしたところ、非常に重たいながらもそれらしき値を表示できたのですが、いかんせん重すぎでほとんとフリーズしてしまいます。
>
> htc dreamのsensors.cとincludeのsensors.hを参考にしてます。
> あとこのサイトが参考になりました→http://jollen.org(chromeの翻訳機能大活躍)
> アドバイスやヒント等いただけたら助かります。
> またなにか参考になるソースやサイトがありましたら教えていただきたく。
>
> 見様見真似でやってますが知識無しで情報も少なくて難儀してます。
> 宜しくお願いいたします。
>
> 2010/5/20 daisougen <daisougen888...@yahoo.com>:
> ...
>
> read more ≫

RYO IKUYAMA

unread,
May 20, 2010, 10:16:03 PM5/20/10
to android-g...@googlegroups.com
daisougenさま

お世話になってます。生山です。
dev/inputを介す利点について説明ありがとうございます。なるほどです。
今後ちゃんと独立したドライバを作る方向で実装します。

ですが、とりあえずいまつないだセンサの値をSensorManager経由で読ませたいのです。
対症療法ですが、とりあえずpollで適当な時間sleepさせれば軽くなるのでしょうか。試してみます。
pollがcallされる間隔をSensorManager側がコントロールしているのかと思っていました。




2010/5/21 daisougen <daisoug...@yahoo.com>:
Reply all
Reply to author
Forward
0 new messages