android sensor架构和原理分析---转载做学习记录

原文地址请点击此处
本文主要描述了在android2.3平台G-sensor相关软硬件的体系架构和实现原理,按照Applications、Framework、HAL、Driver和Hardware五大层次分别介绍。

1.系统架构 (Architecture)

1.1 Android体系架构图

在这里插入图片描述

1.2 Sensor子系统架构图

在这里插入图片描述
· Application Framework
Sensor应用程序通过Sensor应用框架来获取sensor数据,应用框架层的Sensor Manager通过JNI与C++层进行通信。
· Sensor Libraries
Sensor中间层主要由Sensor Manager、Sensor service和Sensor硬件抽象层组成。
· Input Subsystem
通用的Linux输入框架专为与键盘、鼠标和触摸屏等输入设备而设计,并定义了一套标准事件集合。Sensor输入子系统采用采用了通用的Linux输入框架,它通过/sys/class/input节点和用户空间进行交互。
· Event Dev
Evdev提供了一种访问/dev/input/eventX输入设备事件的通用方法。
· AccelerometerDriver
此驱动通过SIRQ和I2C总线与MMA7660模组进行通信。SIRQ用来产生传感器事件中断。

2 应用 (Applications)

2.1 应用开发五步曲

(1) 获取传感器管理器对象;

mSensorManager =(SensorManager) getSystemService(SENSOR_SERVICE);

(2) 获取传感器对象;

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

(3) 定义事件监听器;

mEventListener =new SensorEventListener() {
       @Override
       publicvoid onSensorChanged(SensorEvent event) {
          float[] values = event.values;
          mTextView.setText("Accelerometer:" + values[0] +", "
                 + values[1] +", " + values[2]);
       }
       @Override
       publicvoidonAccuracyChanged(Sensor sensor,int accuracy) {
       }
};

(4) 注册事件监听器;

protectedvoid onResume() {
       super.onResume();
       mSensorManager.registerListener(mEventListener, mSensor,
              SensorManager.SENSOR_DELAY_NORMAL);
}

(5) 卸载事件监听器;

protectedvoid onPause() {
       super.onPause();
       mSensorManager.unregisterListener(mEventListener);
}

3 框架 (Framework)

3.1 工作模型

在这里插入图片描述
3.1.1 SensorManager的创建
在这里插入图片描述
nativeClassInit(): 初始化Native类信息;
sensors_module_init(): 创建Native SensorManager实例,从SensorService读取Sensor设备列表;
sensors_module_get_next_sensor(): 从SensorService读取下一个Sensor设备;

3.1.2 SensorThread数据接收处理
在这里插入图片描述
sensors_create_queue(): 创建和SensorService共享的消息队列;
sensors_data_poll(): 从消息队列中读取SensorService发过来的消息;

3.1.3 SensorService的工作原理
在这里插入图片描述
SensorDevice::poll(): 调用HAL接口读取数据;
SensorEventConnection::sendEvents(): 往消息队列中写入消息,SensorThread后续会读取该消息;

3.1.4 SensorDevice对HAL的访问
在这里插入图片描述

4 硬件抽象层 (HAL)

在这里插入图片描述
在linux操作系统中,应用同硬件之间的交互都是通过设备驱动来实现,Android系统为了降低应用开发人员开发难度,屏蔽硬件差异,定义出硬件抽象层,为开发人员提供获取各种设备相关的信息的接口。

4.1 Sensors HAL关键流程

4.1.1 打开Sensor设备
在这里插入图片描述
SensorBase ::openInput() : 打开input子系统的sensor消息文件句柄;
ioctl(EVIOCGABS(…)) : 获取ABS_X/ABS_Y/ABS_Z的加速度;

4.1.2 轮循Sensor事件
在这里插入图片描述
InputEventCircularReader::fill(): 调用read()从input子系统中读取事件放入环形缓冲区;
InputEventCircularReader::readEvent(): 从环形缓冲区中读取事件;
InputEventCircularReader::next(): 移动环形缓冲区当前指针;

5.2 Sensors HAL关键数据结构

5.2.1 sensors_module_t

struct sensors_module_t {
    struct hw_module_t common;
 
    /**
     * Enumerate all available sensors. The list is returned in "list".
     * @return number of sensors in the list
     */
    int (*get_sensors_list)(struct sensors_module_t* module,
            struct sensor_t const** list);
};

hw_get_module()会加载HAL模块,并返回HAL入口数据结构(hw_module_t)。HAL_MODULE_INFO_SYM默认是“HAL”,在hw_get_module中用dlsym获取。

const struct sensors_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .version_major = 1,
        .version_minor = 0,
        .id = SENSORS_HARDWARE_MODULE_ID,
        .name = "MMA7660 Sensors Module",
        .author = "The Android Open Source Project",
        .methods = &sensors_module_methods,
    },
    .get_sensors_list = sensors__get_sensors_list
};

5.2.2 hw_module_methods_t

static struct hw_module_methods_t sensors_module_methods = {
    .open = open_sensors
};

5.2.3 sensors_poll_context_t

struct sensors_poll_context_t {
    struct sensors_poll_device_t device; // must be first
    sensors_poll_context_t();
    ~sensors_poll_context_t();
    int activate(int handle, int enabled);
    int setDelay(int handle, int64_t ns);
    int pollEvents(sensors_event_t* data, int count);
    int handleToDriver(int handle);
};

5.2.4 sensors_poll_device_t

struct sensors_poll_device_t {
struct hw_device_t common;
 
    int (*activate)(struct sensors_poll_device_t *dev,
            int handle, int enabled);
 
    int (*setDelay)(struct sensors_poll_device_t *dev,
            int handle, int64_t ns);
 
    int (*poll)(struct sensors_poll_device_t *dev,
            sensors_event_t* data, int count);
};

5.2.5 sensor_t:定义传感器的基本参数

static const struct sensor_t sSensorList[] = {
        { "MMA7660 3-axis Accelerometer",
                "Freescale Semiconductor",
                1, SENSORS_HANDLE_BASE+ID_A,
                SENSOR_TYPE_ACCELEROMETER, 3.0f*9.81f, (3.0f*9.81f)/64.0f, 0.35f, 0, { } },
};
struct sensor_t {
    const char*     name;
    const char*     vendor; 
    int             version;
    int             handle;
    int             type;
    float           maxRange;
    float           resolution;
    float           power;
    int32_t         minDelay;
    void*           reserved[8];
};

在学习中进步,如有错误,请多多批评指正

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值