和菜鸟一起学android4.0.3源码之传感器的简单移植

对于加速度传感器,我们只需要知道他的三轴的数据,而android上层也是只需要一个数据结构中的数据而已。

 

1、关于linux驱动层

驱动主要是注册了input设备,通过i2c接口读取传感器寄存器中的三轴数据,并上报这三个数据。

 

 

2、关于android硬件抽象层

在hardware\libhardware\include\hardware下有一个sensors.h的头文件,主要填写这里的一个数据结构就可以了。

结构如下:

[html]  view plain copy
  1. typedef struct {  
  2.     union {  
  3.         float v[3];  
  4.         struct {  
  5.             float x;  
  6.             float y;  
  7.             float z;  
  8.         };  
  9.         struct {  
  10.             float azimuth;  
  11.             float pitch;、  
  12.    
  13.             float roll;  
  14.         };  
  15.     };  
  16.     int8_t status;  
  17.     uint8_t reserved[3];  
  18. } sensors_vec_t;  
  19.    
  20. /**  
  21.  * Union ofthe various types of sensor data  
  22.  * that can be returned.  
  23.  */  
  24. typedef structsensors_event_t {  
  25.     /* must be sizeof(struct sensors_event_t)*/  
  26.     int32_t version;  
  27.    
  28.     /* sensor identifier */  
  29.     int32_t sensor;  
  30.    
  31.     /* sensor type */  
  32.     int32_t type;  
  33.    
  34.     /* reserved */  
  35.     int32_t reserved0;  
  36.    
  37.     /* time is in nanosecond */  
  38.     int64_t timestamp;  
  39.    
  40.     union {  
  41.         float           data[16];  
  42.    
  43.         /* acceleration values are in meter persecond per second (m/s^2) */  
  44.        sensors_vec_t   acceleration;  
  45.    
  46.         /* magnetic vector values are inmicro-Tesla (uT) */  
  47.         sensors_vec_t   magnetic;  
  48.    
  49.         /* orientation values are in degrees */  
  50.         sensors_vec_t   orientation;  
  51.    
  52.         /* gyroscope values are in rad/s */  
  53.         sensors_vec_t   gyro;  
  54.    
  55.         /* temperature is in degrees centigrade(Celsius) */  
  56.         float           temperature;  
  57.    
  58.         /* distance in centimeters */  
  59.         float           distance;  
  60.    
  61.         /* light in SI lux units */  
  62.         float           light;  
  63.    
  64.         /* pressure in hectopascal (hPa) */  
  65.         float           pressure;  
  66.    
  67.         /* relative humidity in percent */  
  68.         float           relative_humidity;  
  69.     };  
  70.     uint32_t        reserved1[4];  
  71. }sensors_event_t;  

而android中源码也有为了这个抽象层专门搞了一个sensor的类,用来处理上报上来的数据,并提供给jni,给android上层。

具体代码在device\samsung\tuna\libsensors这个文件夹下。

具体移植如下:

 

[html]  view plain copy
  1. static structsensor_t sSensorList[LOCAL_SENSORS + MPLSensor::numSensors] = {  
  2.       { "GP2A Light sensor",  
  3.           "Sharp",  
  4.           1, SENSORS_LIGHT_HANDLE,  
  5.           SENSOR_TYPE_LIGHT, 3000.0f, 1.0f,0.75f, 0, { } },  
  6.       { "GP2A Proximity sensor",  
  7.           "Sharp",  
  8.           1, SENSORS_PROXIMITY_HANDLE,  
  9.           SENSOR_TYPE_PROXIMITY, 5.0f, 5.0f,0.75f, 0, { } },  
  10.       { "BMP180 Pressure sensor",  
  11.           "Bosch",  
  12.           1, SENSORS_PRESSURE_HANDLE,  
  13.           SENSOR_TYPE_PRESSURE, 1100.0f, 0.01f,0.67f, 20000, { } },  
  14. };  

这里要修改为自己的设备。

[html]  view plain copy
  1.    
  2. private:  
  3.     enum {  
  4.         mpl               = 0,  //all mpl entries must be consecutive and inthis order  
  5.         mpl_accel,  
  6.         mpl_timer,  
  7.         light,  
  8.         proximity,  
  9.         pressure,  
  10.         numSensorDrivers,       // wake pipe goes here  
  11.         mpl_power,              //special handle for MPL pminteraction  
  12.         numFds,  
  13.     };  

这里选择自己的设备对应的编号

[html]  view plain copy
  1.    
  2. inthandleToDriver(int handle) const {  
  3.         switch (handle) {  
  4.             case ID_RV:  
  5.             case ID_LA:  
  6.             case ID_GR:  
  7.             case ID_GY:  
  8.             case ID_A:  
  9.             case ID_M:  
  10.             case ID_O:  
  11.                 return mpl;  
  12.             case ID_L:  
  13.                 return light;  
  14.             case ID_P:  
  15.                 return proximity;  
  16.             case ID_PR:  
  17.                 return pressure;  
  18.         }  
  19.         return -EINVAL;  
  20.     }  

这里根据不同的id对应上面填写的编号就行。比如我这里是三轴加速度,所以、只要

Case ID_A:

       Return accel;

 

[html]  view plain copy
  1. sensors_poll_context_t::sensors_poll_context_t()  
  2. {  
  3.     FUNC_LOG;  
  4.     MPLSensor* p_mplsen = new MPLSensor();  
  5.     setCallbackObject(p_mplsen); //setup thecallback object for handing mpl callbacks  
  6.     numSensors =  
  7.         LOCAL_SENSORS +  
  8.        p_mplsen->populateSensorList(sSensorList + LOCAL_SENSORS,  
  9.                                     sizeof(sSensorList[0]) * (ARRAY_SIZE(sSensorList) - LOCAL_SENSORS));  
  10.    
  11.     mSensors[mpl] = p_mplsen;  
  12.     mPollFds[mpl].fd =mSensors[mpl]->getFd();  
  13.     mPollFds[mpl].events = POLLIN;  
  14.     mPollFds[mpl].revents = 0;  
  15. ……  
  16. }  

这里的构造函数里,填写三轴加速度的就行。

 

然后根据自己的传感器来新建一个类。创建两个文件,AccelSensor.cpp, AccelSensor.h

具体函数根据libsensor中的就行。

 

移植好后,mm编译后会得到一个sensor.*.so,其中*可以根据你的Android.mk来得到。有了这个然后再跑android系统。就可以使用了。

 

3、关于测试

可以下载一个加速度传感器测试仪来测试,也可以根据重力加速度可以使屏幕旋转来测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值