zoukankan      html  css  js  c++  java
  • 和菜鸟一起学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、关于测试

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

     

     

     

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300031.html
Copyright © 2011-2022 走看看