MTK平台下的sensor框架分析_第1页
MTK平台下的sensor框架分析_第2页
MTK平台下的sensor框架分析_第3页
MTK平台下的sensor框架分析_第4页
MTK平台下的sensor框架分析_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于Android平台下的sensor介绍随着移动互联网技术的普及,人们对智能手机的需要也越来越多。而在众多智能手机操作系统之中, Android 系统凭借着 Google 的技术支持及其开源特性在短时间内迅速占领大量的市场。传感器系统可以让智能手机的功能更加丰富多彩,所以传感器设备已经成为智能手机必备的组件之一。Android 系统可以支持多种传感器,有的传感器已经在 Android 的框架中使用,大多数传感器由应用程序使用。本文基于MTK6582 的平台上 Android 系统的传感器模块进行移植和开发,对 Android 系统框架和开发环境进行了简介,对 Android 系统的传感器模块

2、的驱动层和硬件抽象层的开发进行深入的分析与研究,概括并总结了传感器模块的工作原理和工作流程,对传感器的数据采集、数据传输、设备休眠和设备控制等方面进行了具体的设计与实现,最终在 MTK6582 的平台上实现了传感器模块的驱动层和硬件抽象层。Android 系统可大致分为四部分,应用层、框架层、硬件抽象层、Linux驱动层,Android 系统的传感器模块涉及到了 Android 系统的各个层次。应用层以 Java 为编程语言,一般为第三方开发的应用程序,也有一些是 Google 自己提供的应用程序,框架层是 Google 自己开发的,有着完整代码的体系,提供完善的接口,以便第三方开发应用程序。

3、硬件抽象层是能以封闭源码形式提供硬件驱动模块,可以把框架层与驱动层隔开,使得 Android 框架层的开发能在完全不考虑驱动程序的前提下进行。驱动层会根据硬件的设计对传感器进行初始化和寄存器的读写,使传感器正常工作。Android 系统支持多种传感器,包括加速度传感器、磁力域传感器、方向传感器、陀螺仪、光线传感器、压力传感器、温度传感器、接近传感器,一般手机都支持加速度传感器、磁力域传感器、方向传感器、光线传感器、接近传感器,也有一些比较高端的手机支持陀螺仪。Android系统sensor框架图:我们着重讲解硬件抽象层(hardware abstractal level HAL)和内核层(li

4、nux内核)1. 硬件抽象层Android 的 HAL(硬件抽象层)是 Google 因应厂商“希望不公开源码”的要求下所推出的新观念,让 Android 不至过度依赖 Linux kernel ,让 Android framework 的开发能在不考虑驱动程序的前提下进行发展。2、内核层Android 的核心系统服务依赖于 Linux2.6 内核,包括各种设备的驱动,如显示驱动、键盘驱动、Flash 内存驱动、照相机驱动(Camera Driver)、音频驱动(Audio Driver)、蓝牙驱动(Bluetooth Driver)、WiFi 驱动、Binder IPC 驱动,以及Power

5、 Management(电源管理)、进程管理、内存管理、安全性管理和网络协议栈等操作系统的基本部件。1、HAL层的实现:当Android系统启动时,SystemManager启动SensorDevice服务frameworks/base/cmds/system_server/library/system_init.cpp1 property_get("system_init.startsensorservice", propBuf, "1"); 2 if (strcmp(propBuf, "1") = 0) 3 / Start the

6、 sensor service 4 SensorService:instantiate(); 5 SensorDevice()首先调用hw_get_module()函数获得Sensor设备模块,调用sensors_open这个工具函数,打开Sensor设备模块(调用其methods->open函数指针), 返回Sensor设备的操作接口(这些接口在HAL层实现),保存在mSensorDevice中调用sensors_open函数,函数接着调用module->methods->open()方法,这个open方法在哪里实现了?如下:调用Sensor模块的get_sensors_l

7、ist方法获得传感器列表,在调用get_sensors_list之前,系统已初始化sSensorList结构体,说明系统中有哪些sensor资源。依次激活这些设备并且添加到mActivationCount设备信息向量中。最终调用dev->device.poll = data_poll函数,实现读取sensor数据。static int data_poll(struct sensors_poll_device_t *dev,sensors_event *data,int count)struct sensors_data_context_t *ctx = (struct sensors_d

8、ata_context_t *)dev;return ctx->poll(struct sensors_data_context_t *)dev,data,count);即调用hwm_poll函数hwm_poll()函数过大,就不贴上来了,简要分析其中一段代码:res = ioctl(fd_io,HWM_IO_GET_SENSORS_DATA,&sensors_data);将获得的数据存放在结构体 hwm_trans_data sensors_data中ioctl(fd_io,HWM_IO_GET_SENSORS_DATA,&sensors_data);这个函数将会调用驱

9、动程序中提供的 fops->unlocked_ioctl 函数至此HAL层已讲解完毕。2、LINUX DRIVER层的实现通过以上分析可知,HAL层通过各种接口,最终调用ioctl函数,获取硬件数据。内核空间向HAL层(用户空间)上传数据的方式大概可以分为两种1、 通过copy_from_user和copy_to_user函数实现内核空间和用户空间的数据交互2、 通过input子系统实现数据交互在本平台中,使用的是第一种方式sensor这一类设备是属于i2c设备,因此遵循i2c设备的那一套注册机制,而它本身实质上是字符设备,因此当用户层调用ioctl时,则会调用驱动程序中提供的 fops

10、->unlocked_ioctl 函数。以tmd2772 光照感应传感器为例:驱动层的tmd2772_unlocked_ioctl为用户层调用ioctl时,将调用的函数 在android系统中,提供了一套early_suspend和early_resume机制来管理电源。所以在编写驱动程序时,必须对 Early Suspend 进行注册。注册 early_suspend 之前先要设置 early_suspend 的一些信息,如 level ,suspend、resume 的回调函数。level分为以下三个层次:level 字段用于调整该结构体在注册链表中的位置,启动 suspend 时,

11、level 的数值越小,调用回调函数的时间越早,resume 时则反过来。suspend回调函数主要做的事情是:将任务加入到工作队列链表,睡眠。resume回调函数主要做的事情是:从队列中取出任务,唤醒进程/线程。3、 MTK平台下的sensor针对MTK平台,抽象出一层hwmsensor,来管理所有的模块,为上层提供统一的接口,屏蔽下层硬件不同而导致的差异性。MTK代码里使用了一个hwmsensor模块控制所有的sensor。代码路径:mediatek/kernel/drivers/hwmon/hwmsen/hwmsen_dev.c,编译成hwmsen_dev.o,系统起来后会生成/dev/

12、hwmsensor设备。 使用sensor_operate接口管理所有sensor驱动,向上提供hwmsen_unlocked_ioctl接口再往下就是具体的sensor驱动代码了,根据MTK的驱动结构完成sensor_operate接口,并调用hwmsen_dev.c里的hwmsen_attach函数,把sensor_operate接口加到hwmsen_dev的列表里,这样hwmsen_dev里就能调用所有sensor的sensor_operate函数。以tmd2772为例:定义此类传感器的数据结构体struct tmd2772_priv *obj;tmd2772_priv 结构体在./me

13、diatek/custom/project_name/kernel/alsps/tmd2772/cust_alsps.c中静态定义其中的一些数据参数,并且在该文件中提供了一个函数 get_cust_alsps_hw获取该结构体的头指针。在tmd2772_i2c_probe函数中,定义一个tmd2772_priv 结构体,并分配内存,初始化该结构体的其他参数。然后将其封装在名为struct hwmsen_object的结构体中,即 hwmsen_object.self = tmd2772_obj; hwmsen_object结构体定义如下:struct hwmsen_objectvoid *se

14、lf;int polling;int (*sensor_operate)(void *self,uint32_t command ,void *buff_in, int size_in,void *buff_out, int size_out, int *actualout);其中该结构体中定义了操作sensor的方法,在tmd2772_i2c_probe函数中完成定义如下:struct hwmsen_object obj_als;obj_ps.sensor_operate = tmd2772_ps_operate; 之后调用hwmsen_attach函数,将hwmsen device与sensor device driver连接,hwmsen_attach(ID_LIGHT,&obj_als);具体做法是将struct hwmsen_object obj_als结构体根据不同类型(ID_LIGHT)加入到全局静态的结构体 dev_cxt中。用户层如何获得数据?如上面所上分析,会调用hwmsensor模块中的file_ope

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论