对于加速度传感器,我们只需要知道他的三轴的数据,而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、关于测试
可以下载一个加速度传感器测试仪来测试,也可以根据重力加速度可以使屏幕旋转来测试。