和菜鸟一起学android4.0.3源码之传感器的简单移植
对于加速度传感器,我们只需要知道他的三轴的数据,而android上层也是只需要一个数据结构中的数据而已。
1、关于linux驱动层
驱动主要是注册了input设备,通过i2c接口读取传感器寄存器中的三轴数据,并上报这三个数据。
2、关于android硬件抽象层
在hardware\libhardware\include\hardware下有一个sensors.h的头文件,主要填写这里的一个数据结构就可以了。
结构如下:
typedef struct {
union {
float v[3];
struct {
float x;
float y;
float z;
};
struct {
float azimuth;
float pitch;、
float roll;
};
};
int8_t status;
uint8_t reserved[3];
} sensors_vec_t;
/**
* Union ofthe various types of sensor data
* that can be returned.
*/
typedef structsensors_event_t {
/* must be sizeof(struct sensors_event_t)*/
int32_t version;
/* sensor identifier */
int32_t sensor;
/* sensor type */
int32_t type;
/* reserved */
int32_t reserved0;
/* time is in nanosecond */
int64_t timestamp;
union {
float data[16];
/* acceleration values are in meter persecond per second (m/s^2) */
sensors_vec_t acceleration;
/* magnetic vector values are inmicro-Tesla (uT) */
sensors_vec_t magnetic;
/* orientation values are in degrees */
sensors_vec_t orientation;
/* gyroscope values are in rad/s */
sensors_vec_t gyro;
/* temperature is in degrees centigrade(Celsius) */
float temperature;
/* distance in centimeters */
float distance;
/* light in SI lux units */
float light;
/* pressure in hectopascal (hPa) */
float pressure;
/* relative humidity in percent */
float relative_humidity;
};
uint32_t reserved1[4];
}sensors_event_t;
而android中源码也有为了这个抽象层专门搞了一个sensor的类,用来处理上报上来的数据,并提供给jni,给android上层。
具体代码在device\samsung\tuna\libsensors这个文件夹下。
具体移植如下:
static structsensor_t sSensorList[LOCAL_SENSORS + MPLSensor::numSensors] = {
{ "GP2A Light sensor",
"Sharp",
1, SENSORS_LIGHT_HANDLE,
SENSOR_TYPE_LIGHT, 3000.0f, 1.0f,0.75f, 0, { } },
{ "GP2A Proximity sensor",
"Sharp",
1, SENSORS_PROXIMITY_HANDLE,
SENSOR_TYPE_PROXIMITY, 5.0f, 5.0f,0.75f, 0, { } },
{ "BMP180 Pressure sensor",
"Bosch",
1, SENSORS_PRESSURE_HANDLE,
SENSOR_TYPE_PRESSURE, 1100.0f, 0.01f,0.67f, 20000, { } },
};
这里要修改为自己的设备。
private:
enum {
mpl = 0, //all mpl entries must be consecutive and inthis order
mpl_accel,
mpl_timer,
light,
proximity,
pressure,
numSensorDrivers, // wake pipe goes here
mpl_power, //special handle for MPL pminteraction
numFds,
};
这里选择自己的设备对应的编号
inthandleToDriver(int handle) const {
switch (handle) {
case ID_RV:
case ID_LA:
case ID_GR:
case ID_GY:
case ID_A:
case ID_M:
case ID_O:
return mpl;
case ID_L:
return light;
case ID_P:
return proximity;
case ID_PR:
return pressure;
}
return -EINVAL;
}
这里根据不同的id对应上面填写的编号就行。比如我这里是三轴加速度,所以、只要
Case ID_A:
Return accel;
sensors_poll_context_t::sensors_poll_context_t()
{
FUNC_LOG;
MPLSensor* p_mplsen = new MPLSensor();
setCallbackObject(p_mplsen); //setup thecallback object for handing mpl callbacks
numSensors =
LOCAL_SENSORS +
p_mplsen->populateSensorList(sSensorList + LOCAL_SENSORS,
sizeof(sSensorList[0]) * (ARRAY_SIZE(sSensorList) - LOCAL_SENSORS));
mSensors[mpl] = p_mplsen;
mPollFds[mpl].fd =mSensors[mpl]->getFd();
mPollFds[mpl].events = POLLIN;
mPollFds[mpl].revents = 0;
……
}
这里的构造函数里,填写三轴加速度的就行。
然后根据自己的传感器来新建一个类。创建两个文件,AccelSensor.cpp, AccelSensor.h
具体函数根据libsensor中的就行。
移植好后,mm编译后会得到一个sensor.*.so,其中*可以根据你的Android.mk来得到。有了这个然后再跑android系统。就可以使用了。
3、关于测试
可以下载一个加速度传感器测试仪来测试,也可以根据重力加速度可以使屏幕旋转来测试。
浙公网安备 33010602011771号