加速度、磁界、傾きセンサーを動作させるには?
- 毎回の事だがとりあえず対応。(照度センサーは未対応)
- 手元では画面の自動回転は動作していない。
- 画面の自動回転をオンにするとエラーを出し続けているので未対応(未処理)部分があると思われる。
- アプリケーションでは加速度、磁界、傾きセンサーの各値が取得出来ているようなので、とりあえずその方法をまとめた。
まず、センサー周りの関係ファイルから
例によって、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