• Android Sensor 架构深入剖析【转】


    本文转载自:

    1、Android sensor架构

    Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、 温度传感器(temperature)和距离传感器(proximity)等。

    Android实现传感器系统包括以下几个部分:

    各部分之间架构图如下:

    2、Sensor HAL层接口

    Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h

    对传感器类型的定义:

    传感器模块的定义结构体如下:

    该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。

    对任意一个sensor设备都会有一个sensor_t结构体,其定义如下:

    每个传感器的数据由sensors_event_t结构体表示,定义如下:

    其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示,sensors_vec_t结构体用来表示不同传感器的数据,sensors_vec_t定义如下:

    Sensor设备结构体sensors_poll_device_t,对标准硬件设备 hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中,poll函数用来获取底层数据,调用时将被阻塞定义如下:

    控制设备打开/关闭结构体定义如下:

    3、Sensor HAL实现(以LM75温度传感器为例子)

    (1)打开设备流程图

    (2)实现代码分析

    在代码中含有两个传感器ADC电位器和LM75温度传感器,所以在sensor.c中,首先需要定义传感器数组device_sensor_list[],其实就是初始化struct sensor_t结构体,初始化如下:

    定义open_sensors函数,来打开Sensor模块,代码如下:

    在这个方法中,首先需要为hw_device_t分配内存空间,并对其初始化,设置重要方法的实现。

    control_open_data_source()打开传感器并使能设备:

    调用sensor__data_poll方法读取数据:

    /*轮询读取数据*/
            static int sensors__data_poll(struct sensors_data_context_t *dev, sensors_data_t * values)
            {
                int n;
                int mag;
                float temp;
                char buf[10];
                while (1) {
                if(count % 3 == 2) // 读取ADC值
                {
                    if( read(dev->event_fd[0], &mag, sizeof(mag)) < 0)
                    {
                       LOGE("read adc error");
                    }else{ 
                    dev->sensors[ID_MAGNETIC_FIELD].magnetic.v[0] =(float)mag; 
                    LOGE("read adc %f ",(float)mag);
                    *values = dev->sensors[ID_MAGNETIC_FIELD];
                    values->sensor = ID_MAGNETIC_FIELD;
                    count++;
                    }
                    usleep(500000);
                    return ID_MAGNETIC_FIELD;
                    }
                    else if(count%3 == 1) //读取温度传感器值
                     {
                    memset(buf, 0 ,sizeof(buf));
                    if((n = read(dev->event_fd[1], buf, 10)) < 0)
                    {
                        LOGE("read temp error");
                        }else{
                        buf[n - 1] = '';
                        temp =(float) (atoi(buf) / 1000);
                        dev->sensors[ID_TEMPERATURE].temperature = temp;
                        LOGE("read temp %f ",temp);
                        *values = dev->sensors[ID_TEMPERATURE];
                        values->sensor = ID_TEMPERATURE;
                        count++;
                    }
                        close(dev->event_fd[1]);
                        dev->event_fd[1]= open("/sys/bus/i2c/devices/0-0048/temp1_input", O_RDONLY);
                        usleep(500000);
                        return ID_TEMPERATURE;
                   }
                   else if(count%3 == 0) //读取方向传感器模拟值
                     {
                        LOGI("read orientation ");
                        /* fill up data of orientation */
                        dev->sensors[ID_ORIENTATION].orientation.azimuth = x + 5;
                        dev->sensors[ID_ORIENTATION].orientation.pitch = y + 5;
                        dev->sensors[ID_ORIENTATION].orientation.roll = z + 5;
                        *values = dev->sensors[ID_ORIENTATION];
                        values->sensor = ID_ORIENTATION;
                        count++;
                        x += 0.0001; y += 0.0001; z += 0.0001;
                        usleep (500000);
                        return ID_ORIENTATION;
                  }
                }
            }

  • 相关阅读:
    【项目】项目41
    【项目】项目40
    【项目】项目39
    【项目】项目38
    【项目】项目37
    15-155. Min Stack
    14-160. Intersection of Two Linked Lists
    13-169. Majority Element
    12-206. Reverse Linked List
    11-215. Kth Largest Element in an Array
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/10963407.html
Copyright © 2020-2023  润新知