和菜鸟一起学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、关于测试

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

 

 

 

原文地址:https://www.cnblogs.com/wuyida/p/6300031.html