郑宏祥 李伟 刘稳
济宁科力光电产业有限责任公司 山东省济宁市 272000
摘要:在新时期环境下,科技技术得到迅速发展,越来越多先进科技技术不断得到研发与使用,其中智能设备逐渐受到了人们的关注,且在人们的生活应用中不断深入。在智能设备的发展中,传感器发挥着重要的作用,它能够有效促进智能设备功能的丰富,通过传感器的驱动设计能够有效实现强大功能的发挥,提高人们智能设备的使用体验。下面,文章就主要针对基于Android的传感器驱动设计与实现进行探讨,来对此技术的开发与应用进行深入了解。
关键词:Android;传感器;驱动设计;智能设备
前言:在目前智能设备中,很多都是采用Android操作系统,它具有着卓越的性能和流畅的界面等特点,受到了人们的广泛喜爱,且此系统的智能设备产量和市场的占有率也呈现出逐年上升状态。在Android操作系统的智能设备中,通过驱动程序对操作系统与硬件实现联系,智能设备的底层也是通过诸多高性能传感器作为支撑,为了促进智能设备功能实现和丰富,就要对驱动程序实施开发和编写,而基于Android的传感器驱动如何设计和实现,就是文章主要研究的内容。
1.Android系统的驱动原理分析
在Android的系统中,其架构可以分作四层次,自上而下分别为应用的程序、应用的程序框架、各类库与运行的环境以及Linux的内核层。此系统是以Linux为基础进行开发,对Linux的内核使用,但和Linux的系统内用户空间对硬件驱动访问的实现不同,此系统在应用层通过Java的语言实施开发,若应用程序需要对驱动程序的操作硬件调用的话,一定要借助Java对JNI本地调用和本地方法实施交互,来对应用层至底层调用实现;且系统对其驱动程序的HAL层实施封装,来实现对硬件的抽象化,对特定平台硬件的接口细节实施隐藏,这对硬件厂商的相关利益实现了一定的保护,也对Android的框架和Linux的内核实现隔离,进而对应用程序的框架层实施开发中可以不对驱动程序考虑而进行,有效实现可移植性的提升。另外,Android的程序架构内也存在一些较为简单型子系统,在物理上并未存在硬件的抽象层,其硬件的抽象功能部分并不在单独性代码内,应用的程序可借助JNI的部分代码对驱动程序设备的节点直接调用[1]。
2.基于Android的传感器驱动设计与实现
2.1传感器情况
文内所用传感器是DS18B20的传感器类型,此传感器内只存在一数据的输入和输出口,是一种单总线类型温度的传感器。此传感器工作时,被测的温度值以单总线数字方式进行传输,对系统抗干扰的能力有效提升,其内部采用在板专利的技术,所有传感元件和转换的电路都集成在“三极管”集成电路中。它对温度的测量在-55℃-+125℃范围内,处于-10 ℃-+85℃范围时精度在±0.5℃范围,可编程分辨率是9-12位,于9位的分辨率时,最多93. 75ms就能够将温度进行数字转化。对硬件的连接中,使用开发板对I/O的接口进行GPN15扩展,并和数据接口DS18B20连接,此传感器供电方式是外部电源的供电[2]。
2.2设计Linux系统内核层的驱动程序
此传感器将字节当作单位顺序实现读取访问,是字符设备类型。它的驱动程序有注册设备、赋值file_ operations(文件操作的结构体)、文件操作的结构体内全部函数具体的实现、设备注销等步骤,其中file_ operations的实现是设计重点,也是文内主要分析的内容。
通过file_ operation 对设备号和驱动程序斤连接,它是一类内核数据的结构。在结构体内存在成员函数,它是字符的设备在驱动程序的设计中的主体部分,此类函数在open()、read() 、write()和close()等应用的程度中调用。在结构体内,read()的函数和ds18b20_ read()的函数对应,此函数程序内首先对声明read_ tem()的函数获调用,此函数按照DS18B20的数据手册所定义时序实现相应功能的完成。
完成初始化的复位后,就可以实现通信。把数据线自逻辑的高电平向逻辑的低电平拉到时,开始写时序,对控制器的0时序先写,把数据线拉至低电平进行65μs的延时,在控制器的1时序写时,要把数据线拉至低电平后进行释放。主机把数据线自高电平向低电平拉到且维持2μs的时间,设置成输入的释放线,开始读时序,数据的采样开始仅仅在15μs范围内具有有效性,完成读时序时,I/O的引脚会被外部的上拉电阻向高电平拉到,全部读时序的间隙最少是60μs的时间,还要包括两读周期间中至少存在1μs恢复的时间。按照时序对ds_ reset()的函数实现复位的初始化完成,对ds_ send()的函数指令发送[3]。
2.3对HAL的硬件进行抽象层的设计
按照本层的架构,进行3结构体的定义。在本层实现的流程中,和这3结构体存在很大关系。上层借助硬件id对hw_ get_ module()的函数调用,进而获取ds18b20_ module_ 1的硬件模块,后从此模块内实现ds18b20_ module_ method_ 1的获得,并对所得到硬件的设备内ds18b20_ device_ 1打开,对此设备内get_ read()的函数调用,就能够调用18B20并实现Linux的内核层驱动。
2.4设计Frame Work的框架层
此部分设计你中,主要包括HAL层的JNI法编写实现上层向下层的访问、对框架层进行Java的接口硬件访问的服务提供两个部分。
在第1部分中,要对jniRegisterNativeMethods()调用来实现JNI法的注册。在JNI法内,有jboolean ds18b20_ init()和jint ds18b20_ getRead()函数,前者借助硬件模块的id对指定HAL的模块加载且对硬件打开,而后者是通过硬件的抽象层所定义硬件的访问接口所得到18B20值。
在第2部分中,对硬件服务主要是在一独立性进程运行中实现各种应用的程序服务提供,而想要实现对此类硬件服务应用程序的调用以及对硬件服务间实现通信,要借助代理来实现。所以,要先对通信接口做好定义。在接口定义内存在int get Read()函数,则Ds18b20Service就需要通过JNI法调用来实现硬件服务的提供[4]。
3.测试驱动的程序
在Linux的内核层、程序的框架层和硬件的抽象层实现后,借助Android内编译和打包的工具,就能够实现对每个模块编译和系统的加载。完成后,通过系统工具对Android的源代码编译打包为SDK,后借助此SDK在Eclipse内进行测试应用的编写,对驱动程序实施测试。
结语:综上所述,文章以DS18B20的传感器为例,对基于Android的传感器驱动设计与实现从Linux的内核层、程序的框架层和硬件的抽象层进行了详细分析,希望对相关设计工作的开展具有参考价值。
参考文献:
[1]梁永恩,万世明.基于Android的数字温湿度传感器驱动开发及应用[J].微型电脑应用,2016,32(02):74-77.
[2]崔世钢,代凤辉,梁帆.基于Android平台串口驱动的多传感器数据传输的实现[J].江苏农业科学,2016,44(01):403-405.
[3]姬翔宇. 基于Android平台的蓝牙及GPS驱动设计与实现[J]. 辽宁科技学院学报, 2018, v.20;No.81(01):9+13-14.
[4]康亚可.Linux字符设备驱动开发及其在Android系统上的实现[J].工业控制计算机,2017,30(01):63-65.