センサーを有効にする

加速度、磁界、傾きセンサーを動作させるには?

  • 毎回の事だがとりあえず対応。(照度センサーは未対応)
  • 手元では画面の自動回転は動作していない。
  • 画面の自動回転をオンにするとエラーを出し続けているので未対応(未処理)部分があると思われる。
  • アプリケーションでは加速度、磁界、傾きセンサーの各値が取得出来ているようなので、とりあえずその方法をまとめた。
まず、センサー周りの関係ファイルから
例によって、1.6からサービスとlibは流用する。
akmdと言うのが標準(?)なのかどうなのかイマイチ調べは付いていないのだが、センサーを司っているらしいそのakmd2というのがあるらしい、それをinit.rcで起動しておく。
センサーのライブラリは sensors.default.so である。

以下は、ソースからビルドするセンサー関連ファイル。
センサーのインタフェース(修正する)
$ANDROID_SRC/hardware/libhardware/include/hardware/sensors.h
ここで下記のようにセンサー種別が定義されている。
#define SENSOR_TYPE_ACCELEROMETER       1
#define SENSOR_TYPE_MAGNETIC_FIELD      2
#define SENSOR_TYPE_ORIENTATION         3
#define SENSOR_TYPE_GYROSCOPE           4
#define SENSOR_TYPE_LIGHT               5
#define SENSOR_TYPE_PRESSURE            6
#define SENSOR_TYPE_TEMPERATURE         7
#define SENSOR_TYPE_PROXIMITY           8
今回は、1~3に対応する作業となる。

ライブラリの動的読み込み(HAL)
$ANDROID_SRC/hardware/libhardware/hardware.c
Android側からの制御(1)
$ANDROID_SRC/frameworks/base/core/jni/android_hardware_SensorManager.cpp
Android側からの制御(2) (修正する) こちらは、すべて見てないので対応漏れがあるかも。
$ANDROID_SRC/frameworks/base/services/jni/com_android_server_SensorService.cpp

1.6からの変更で動作しなくなっているようなので、上位互換性を確保する。
$ANDROID_SRC/hardware/libhardware/include/hardware/sensors.h
の、構造体 sensors_control_device_t が変更になったため、旧libでは呼び出しアドレスにズレが生じたのだと思われる。
旧libとの互換性維持の為、次のように順番を変更した。(コメントは削除している)
2.2デフォルト
struct sensors_control_device_t {
    struct hw_device_t common;

    native_handle_t* (*open_data_source)(struct sensors_control_device_t *dev);
    int (*close_data_source)(struct sensors_control_device_t *dev);
    int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
    int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);
    int (*wake)(struct sensors_control_device_t *dev);
};
を下記のように修正。
1.6との互換性確保
struct sensors_control_device_t {
    struct hw_device_t common;

    native_handle_t* (*open_data_source)(struct sensors_control_device_t *dev);
    int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
    int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);
    int (*wake)(struct sensors_control_device_t *dev);
    int (*close_data_source)(struct sensors_control_device_t *dev);
};

旧libのままで close_data_source をコールすると何処に飛んでいくか分からないので、
$ANDROID_SRC/frameworks/base/services/jni/com_android_server_SensorService.cpp
の close_data_source の呼び出し元をコメントアウトした。
static jint
android_close(JNIEnv *env, jclass clazz)
{
/*
    if (sSensorDevice->close_data_source)
        return sSensorDevice->close_data_source(sSensorDevice);
	else
*/
        return 0;
}

その他ファイルの配備

/system/etc/permissions/以下に
$ANDROID_SRC/frameworks/base/data/etc/android.hardware.sensor.compass.xml
$ANDROID_SRC/frameworks/base/data/etc/android.hardware.sensor.accelerometer.xml
の2つのファイルを転送する。

1.6のデフォルトの
/data/misc/akmd_set.txt
は、symlink/data 環境にコピーする。

最後に、
chown compass.system /dev/akm8973_aot
chmod 666 /dev/akm8973_aot
chown compass.system /dev/akm8973_dev 
chmod 666 /dev/akm8973_dev 
chown compass.system /dev/smb380_dev
chmod 666 /dev/smb380_dev
を init.rc に記述しておく。
デフォルト1.6では666になっていたが、どのプロセスが書き換えているのだろうか?
調べが付いてないので permission の設定もとりあえず…。

以上を変更し、ビルドする事でセンサーはとりあえず動くようになった。

長時間運用、on & off の繰り返しは未検証の為何が起こるか分からない。

コメント
名前:
コメント:

すべてのコメントを見る












(2011/02/04 0:07 公開)
最終更新:2011年02月04日 02:18
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。