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\n",(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] = '\0';
temp =(float) (atoi(buf) / 1000);
dev->sensors[ID_TEMPERATURE].temperature = temp;
LOGE("read temp %f\n",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\n");
/* 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;
}
}
}
Android Sensor 架构深入剖析【转】的更多相关文章
- android sensor架构
Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...
- 最强Android书 架构大剖析 作者网站
http://newandroidbook.com/ jonathan levin (最强Android书 架构大剖析) http://newandroidbook.com/AIvI-M-R ...
- Android sensor架构分析
一.其主要框架如下图所示: 二.sensor的JNI层:android_hardware_SensorManager.cpp (frameworks\base\core\jni) 注册JN ...
- Android Sensor详解(1)简介与架构【转】
本文转载自:https://blog.csdn.net/u013983194/article/details/53244686 最近在学习有关如何porting sensor的东西,仅借此机会写博客来 ...
- 转载: android 学习架构
http://www.cnblogs.com/forlina/archive/2011/06/29/2093332.html 引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWor ...
- 改造 Android 官方架构组件 ViewModel
前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, ...
- Android体系架构详解
Andriod是什么? 首先,就像Android开源和兼容性技术负责人Dan Morrill在Android开发手册兼容性部分所解释的,“Android并不是传统的Linux风格的一个规范或分发版本, ...
- 2020再见&新的计划(建立Android体系架构)
2020,再见 关于2020,我心中有四个关键词: 疫情 年初突如其来的疫情,打破了原本生活的节奏,也没想到会笼罩全世界整整一年,希望这个世界早点好起来吧. 科比 初三的早晨,噩耗传来,我一度不敢相信 ...
- Android系统架构说明介绍
Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...
随机推荐
- python3常用的内置函数
数学相关 abs(a) : 求取绝对值.abs(-1) max(list) : 求取list最大值.max([1,2,3]) min(list) : 求取list最小值.min([1,2,3]) su ...
- Jnetpcap简述
Jnetpcap简述 最近需要做一个本地网络流量分析的项目,基于 Java 语言,上网查了很多资料,最后利用 Jnetpcap 实现了,这里做个记录. 这里先列一下我用到的工具以及版本: Eclips ...
- Eclipse apk项目创建和项目构架
一.创建项目工程 设定名字 设定包名(每一台机器只有唯一的包名)下一步 根据设置进行选择 创建空项目 Finish即可创建 调节项目的字体 二.Eclipse 项目构架 Src 2. Gen R.ja ...
- Jmeter如何测试接口
现在对测试人员的要求越来越高,不仅仅要做好功能测试,对接口测试的需求也越来越多!所以也越来越多的同学问,怎样才能做好接口测试? 要真正的做好接口测试,并且弄懂如何测试接口,需要从如下几个方面去分析问题 ...
- 大数据集群环境搭建之一 hadoop-ha高可用安装
1.如果你使用root用户进行安装. vi /etc/profile 即可 系统变量 2.如果你使用普通用户进行安装. vi ~/.bashrc 用户变量 export HADOOP_HOME=/ex ...
- 国内不fq安装K8S一: 安装docker
目录 1.安装docker 1.1 准备工作 1.2 安装docker 1.3 修改cgroup 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国内不fq ...
- ShareSDK For Unity集成
Mob ShareSDK Android - V2.7.10 iOS - V3.5.0 Mob下载:https://github.com/MobClub/New-Unity-For-ShareSDK ...
- PAT 乙级 1003.我要通过! C++/Java
1003 我要通过! (20 分) 题目来源 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则 ...
- 安卓QQ聊天记录导出、备份完全攻略
发到知乎竟然被删掉,我也不知道我到底违反了哪条.唉,别人的毕竟是别人的.虽然博客园也是别人的 前言 我对聊天记录的备份比较执着,也在这上面折腾过不少.碰到过不少令人头疼的麻烦,在这里分享一下经验. 关 ...
- blockingqueue.h
#include <mutex> #include <condition_variable> #include <deque> template <typen ...