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、关于测试

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

     

     

     

  • 相关阅读:
    格式化HDFS出现java.io.IOException: Cannot create directory /opt/hdfs/name/current错误
    Hadoop集群安装教程(完全分布模式)——更新中
    将sql语句嵌入到c语言中——codeblocks
    centos虚拟机网络连接问题
    Linux虚拟机如何调整登录界面的分辨率——解决登录界面图标过大的问题
    Spring Cloud常用组件超时总结
    程序集加载与反射笔记
    ASP.NET分页
    显式向标识列插入数据
    JIT和程序的首次执行
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300031.html
Copyright © 2011-2022 走看看