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