如何理解Sensor架构华清远见.docx
- 文档编号:1196300
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:52
- 大小:1,012.64KB
如何理解Sensor架构华清远见.docx
《如何理解Sensor架构华清远见.docx》由会员分享,可在线阅读,更多相关《如何理解Sensor架构华清远见.docx(52页珍藏版)》请在冰豆网上搜索。
如何理解Sensor架构华清远见
如何理解Sensor架构?
本篇文章来自华清远见嵌入式学院讲师:
倪键树。
主要给大家讲解如何理解如何理解Sensor架构,希望看完后对新手有一定的帮助。
1、Androidsensor架构
Android4.0系统内置对传感器的支持达13种,它们分别是:
加速度传感器(accelerometer)、磁力传感器(magneticfield)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。
Android实现传感器系统包括以下几个部分:
各部分之间架构图如下:
2、SensorHAL层接口
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结构体的扩展,主要完成读取底层数据,并将数据存储在structsensors_poll_device_t结构体中,poll函数用来获取底层数据,调用时将被阻塞定义如下:
控制设备打开/关闭结构体定义如下:
3、SensorHAL实现(以LM75温度传感器为例子)
(1)打开设备流程图
(2)实现代码分析
在代码中含有两个传感器ADC电位器和LM75温度传感器,所以在sensor.c中,首先需要定义传感器数组device_sensor_list[],其实就是初始化structsensor_t结构体,初始化如下:
定义open_sensors函数,来打开Sensor模块,代码如下:
在这个方法中,首先需要为hw_device_t分配内存空间,并对其初始化,设置重要方法的实现。
control_open_data_source()打开传感器并使能设备:
调用sensor__data_poll方法读取数据:
/*轮询读取数据*/
staticintsensors__data_poll(structsensors_data_context_t*dev,sensors_data_t*values)
{
intn;
intmag;
floattemp;
charbuf[10];
while
(1){
if(count%3==2)//读取ADC值
{
if(read(dev->event_fd[0],&mag,sizeof(mag))<0)
{
LOGE("readadcerror");
}else{
dev->sensors[ID_MAGNETIC_FIELD].magnetic.v[0]=(float)mag;
LOGE("readadc%f\n",(float)mag);
*values=dev->sensors[ID_MAGNETIC_FIELD];
values->sensor=ID_MAGNETIC_FIELD;
count++;
}
usleep(500000);
returnID_MAGNETIC_FIELD;
}
elseif(count%3==1)//读取温度传感器值
{
memset(buf,0,sizeof(buf));
if((n=read(dev->event_fd[1],buf,10))<0)
{
LOGE("readtemperror");
}else{
buf[n-1]='\0';
temp=(float)(atoi(buf)/1000);
dev->sensors[ID_TEMPERATURE].temperature=temp;
LOGE("readtemp%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);
returnID_TEMPERATURE;
}
elseif(count%3==0)//读取方向传感器模拟值
{
LOGI("readorientation\n");
/*fillupdataoforientation*/
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);
returnID_ORIENTATION;
}
}
}
下面是另外的博主写的内容
1.体系结构
2.数据结构
3.四大函数
本文以重力感应器装置G-sensor为例探索Android的各层次结构。
1.体系结构
Android的体系结构可分为4个层次。
第一层次底层驱动层,包括标准Linux,Android核心驱动,Android相关设备驱动,G-sensor的设备驱动程序即存在于此
第二层次Android标准C/C++库,包括硬件抽象层,Android各底层库,本地库,JNI
第三层次AndroidJavaFramwork框架层
第四层次Java应用程序
本文重点关注硬件抽象层,JNI以及Framework。
1.1硬件抽象层
硬件抽象层通过例如open(),read(),write(),ioctl(),poll()等函数调用的方式,与底层设备驱动程序进行交互,而这些函数调用是底层设备驱动程序事先准备好的。
用于交互的关键是文件描述符fd,fd通过open()打开G-sensor设备节点而得到,即fd=open("/dev/bma220",O_RDONLY);而/dev/bma220这个设备节点是在底层设备驱动中注册完成的。
其他的函数调用如read(),write()等都通过该文件描述符fd对G-sensor设备进行操作。
1.2JNI(JavaNativeInterface)
JNI层可以认为是整个体系结构中的配角,概括地讲,它就完成了一项任务,既实现从C++语言到Java语言的转换。
JNI层为JavaFramework层提供一系列接口,而这些接口函数的具体实现中,利用例如
module->methods->open(),sSensorDevice->data_open(),sSensorDevice->poll()等回调函数与硬件抽象层进行交互。
而这些open(),poll()回调函数在硬件抽象层中具体实现。
1.3JavaFramework
Framework层提供各种类和类的对象,可作为系统的守护进程运行,也可供上层应用程序的使用。
例如类SensorManager,它作为系统的守护进程在初始化的时候开始运行,其子类SensorThread中的子类SensorThreadRunnable通过sensors_data_poll()实现了对G-sensor数据的轮训访问,而sensors_data_poll()通过JNI层转换到硬件抽象层去具体实现poll()。
2数据结构
一般境况下,硬件抽象层对硬件的描述都分为control和data两大类。
2.1sensors_control_context_t
structsensors_control_context_t{
structsensors_control_device_tdevice;
intfd;
};
structsensors_control_device_t{
struct
hw_device_tcommon;
int(*open_data_source)(structsensors_control_device_t*dev);
int(*activate)(structsensors_control_device_t*dev,inthandle,intenabled);
int(*set_delay)(structsensors_control_device_t*dev,int32_tms);
int(*wake)(structsensors_control_device_t*dev);
};
2.2sensors_data_context_t
structsensors_data_context_t{
structsensors_data_device_tdevice;
intfd;
};
structsensors_data_device_t{
structhw_device_tcommon;
int(*data_open)(structsensors_data_device_t*dev,intfd);
int(*data_close)(structsensors_data_device_t*dev);
int(*poll)(structsensors_data_device_t*dev,
sensors_data_t*data);
}
structhw_device_t{
uint32_ttag;uint32_tversion;
structhw_module_t*module;
int(*close)(structhw_device_t*device);
};
structhw_module_t{
uint32_ttag;uint16_tversion_major;uint16_tversion_minor;
constchar*id;constchar*name;constchar*author;
structhw_module_methods_t*methods;
};
struct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 理解 Sensor 架构 远见