一种操作系统中控制硬件设备的方法和装置转让专利

申请号 : CN201410510111.7

文献号 : CN104267956B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 不公告发明人

申请人 : 深圳光启智能光子技术有限公司

摘要 :

一种操作系统中控制硬件设备的方法和装置,获取到用于控制硬件设备动作的状态数据,将其下发并存储到缓冲单元;调用硬件设备驱动,硬件设备驱动读取缓冲单元中的状态数据,根据状态数据控制硬件设备动作的状态。调用硬件设备驱动包括:调用已有的硬件设备驱动,以控制硬件设备动作;或者获取链接库加载指令,加载链接库;获取用于控制硬件设备动作的指令,调用链接库中与该指令对应的功能实现函数;执行被调用的功能实现函数,以控制硬件设备执行相应的动作。硬件设备驱动控制硬件设备执行动作为直接控制方式,能够有效避免在驱动硬件设备动作时出现中断、延迟等现象,从而提高数据传输的准确性,为高速数据传输提供了保证。

权利要求 :

1.一种操作系统中控制闪光灯的方法,其特征在于,包括:

获取用于控制闪光灯动作的状态数据;

将所述状态数据下发并存储到缓冲单元中;

获取链接库加载指令,加载链接库,所述链接库中包括用于控制闪光灯动作的功能实现函数;

获取用于控制闪光灯动作的指令;

调用所述链接库中与所述控制闪光灯动作的指令对应的功能实现函数;

执行被调用的功能实现函数,以控制闪光灯执行相应的动作;

调用独立设置的闪光灯驱动,所述闪光灯驱动读取保存在缓冲单元中的状态数据,根据所述状态数据控制闪光灯动作的状态。

2.如权利要求1所述的方法,其特征在于,获取用于控制闪光灯动作的状态数据,具体为:获取原始数据,对原始数据编码后得到所述状态数据。

3.如权利要求1所述的方法,其特征在于,所述状态数据为表示时间数据的数组;所述闪光灯驱动根据所述状态数据控制闪光灯动作的状态,具体为:闪光灯驱动按照所述数组中数据元素的顺序控制闪光灯开启或关闭的时间。

4.如权利要求1所述的方法,其特征在于,所述状态数据为表示时间数据、亮度数据或强度数据的数组。

5.如权利要求1所述的方法,其特征在于,所述操作系统为安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或Mac OS系统。

6.如权利要求1-5任一项所述的方法,其特征在于,当所述操作系统为安卓系统时,所述闪光灯驱动设置于所述安卓系统的内核驱动层中;或者,当所述操作系统为IOS系统,所述闪光灯驱动设置于所述IOS系统的核心系统层中。

7.如权利要求6所述的方法,其特征在于,当所述操作系统为安卓系统时,所述安卓系统的JNI层定义有相应的JNI接口函数;

获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库中与控制闪光灯动作的指令对应的功能实现函数,以供内核驱动层的闪光灯驱动执行相应的功能实现函数;或者,当所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数;

获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库 中与控制闪光灯动作的指令对应的功能实现函数,以供核心系统层的闪光灯驱动执行相应的功能实现函数。

8.如权利要求7所述的方法,其特征在于,JNI层保存有功能实现函数实例化后的地址。

9.如权利要求8所述的方法,其特征在于,当所述操作系统为安卓系统时,所述安卓系统还包括硬件抽象层,所述安卓系统的硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和JNI层提供对闪光灯控制的接口实现;或者当所述操作系统为IOS系统,所述IOS系统还包括核心服务层。

10.一种操作系统中控制闪光灯的装置,其特征在于,包括:

状态数据获取单元,用于获取用于控制闪光灯动作的状态数据;

传输单元,用于将所述状态数据下发;

缓冲单元,用于存储传输单元下发的状态数据;

独立设置的闪光灯驱动,用于直接控制闪光灯;

第一执行单元,用于调用闪光灯驱动,并控制所述闪光灯驱动读取保存在缓冲单元中的状态数据,根据所述状态数据控制闪光灯动作的状态;

加载单元,用于获取链接库加载指令,并加载链接库,所述链接库中包括用于控制闪光灯动作的功能实现函数;

检测单元,用于获取控制闪光灯动作的指令;

调用单元,用于调用所述链接库中与所述控制闪光灯动作的指令对应的功能实现函数;

第二执行单元,用于控制所述闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作。

11.如权利要求10所述的装置,其特征在于,所述状态数据获取单元还包括编码子单元,用于获取原始数据,对原始数据编码后得到所述状态数据。

12.如权利要求10所述的装置,其特征在于,所述状态数据为表示时间数据的数组;所述第一执行单元控制闪光灯驱动根据所述状态数据控制闪光灯的状态时:第一执行单元控制闪光灯驱动按照所述数组中数据元素的顺序控制闪光灯开启或关闭的时间。

13.如权利要求10所述的装置,其特征在于,所述状态数据为表示时间数据、亮度数据或强度数据的数组。

14.如权利要求10所述的装置,其特征在于,所述操作系统为安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或 Mac OS系统。

15.如权利要求10-14任一项所述的装置,其特征在于,当所述操作系统为安卓系统时,所述闪光灯驱动设置于所述安卓系统的内核驱动层中;或者当所述操作系统为IOS系统时,所述闪光灯驱动设置于所述IOS系统的核心系统层中 。

16.如权利要求15所述的装置,其特征在于,当所述操作系统为安卓系统时,所述安卓系统的架构还包括JNI层,所述JNI层定义有相应的JNI接口函数;

调用单元用于根据所述接口函数调用所述链接库中与控制闪光灯动作的指令对应的功能实现函数,以供内核驱动层的闪光灯驱动执行相应的功能实现函数;或者所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数;

调用单元用于根据所述接口函数调用所述链接库中与控制闪光灯动作的指令对应的功能实现函数,以供内核驱动层的闪光灯驱动执行相应的功能实现函数。

17.如权利要求16所述的装置,其特征在于,所述JNI层保存有功能实现函数实例化后的地址。

18.如权利要求17所述的装置,其特征在于,当所述操作系统为安卓系统时,所述安卓系统的架构还包括硬件抽象层,所述硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和JNI层提供对闪光灯控制的接口实现;或者当所述操作系统为IOS系统时,所述IOS系统还包括核心服务层。

说明书 :

一种操作系统中控制硬件设备的方法和装置

技术领域

[0001] 本申请涉及电子设备操作系统的开发,具体涉及一种操作系统中控制硬件设备的方法和装置。

背景技术

[0002] 请参考图1,为安卓系统的架构示意图。
[0003] 第一层101为Linux内核驱动层(Linux kernel),其由C/C++实现。安卓核心系统服务依赖于Linux内核,包括安全性、内存管理、进程管理、网络协议、驱动模型等。Linux内核也作为硬件和软件栈之间的抽象层,除了标准的Linux内核外,安卓还增加了内核的驱动程序,例如:Binder(IPC)驱动、camera驱动、电源管理等。
[0004] 第二层为组件库和虚拟机层,其中,102为组件库层(Libraries),103为虚拟机层(Android Runtime),组件库层102通过C/C++实现,包含C/C++库,用于安卓系统中不同的组件使用,它们通过安卓应用程序框架为开发者进行服务。虚拟机层103作为安卓系统的运动环境,其提供了Java编程语言核心库的大多数功能,由Dalvik Java虚拟机和基础的Java类库组成。
[0005] 第三层104为应用框架层(Application Framework),在安卓系统中,开发人员也可以完全访问核心应用程序所使用的API(Application Programming Interface,应用程序编程接口)框架。
[0006] 第四层105为应用程序层(Applications),安卓应用程序都是采用Java语言编写的,用户开发的安卓应用程序和安卓的核心应用程序是同一层次的,它们都是基于安卓的系统API构建的。
[0007] 目前,众多的电子设备采用安卓系统,且设备硬件上都安装有闪光灯,在很多情况下,用户具有使用闪光灯的需求,因此,如何在安卓系统上实现闪光灯的控制,是本领域技术人员正在研究的问题。
[0008] 一方面,随着光通信的发展,越来越多的电子设备通过使用闪光灯来进行光通信。在安卓系统中,例如,用户在应用程序层控制将某一数据通过闪光灯以光通信的方式发送出去,则该数据作为待发送数据,根据相应的编码规则将该数据转换成控制闪光灯亮灭的时间数据,即在应用程序层产生了控制闪光灯开关的时间数据。然而应用程序层在获取到控制闪光灯的指令后,对闪光灯驱动的调用指令是一条一条发送的,闪光灯驱动执行完一条指令后,等待应用程序层发送的下一条指令,加上应用程序层将指令传达到驱动层需要经过应用框架层、组件库层和虚拟机层等层级,其间,必然会出现一定的时间延迟,从而影响光通信过程中数据传输的准确性。
[0009] 在光通信中,通常采用的是可见光通信,该可见光即可用于进行数据传输,又可以作为照明用。然而,由于上述时间延迟问题,使得数据传输过程中,为了保证数据的准确性,需要适当限制其传输速度(可见光的闪烁频率)。因此,对于需要对数据进行高速传输时,无法很好地适用。
[0010] 另一方面,在安卓系统中,当需要控制闪光灯的开关时,通常是先调用camera driver,利用camera自带的接口,通过设置camera的参数,来实现闪光灯的开关。而这种对闪光灯的控制方式,属于间接控制,其对闪光灯的调用具有一定的时间延迟。

发明内容

[0011] 本申请提供的一种操作系统中控制硬件设备的方法和装置,可以直接控制硬件设备,并解决信息传输延迟、中断的问题。
[0012] 根据本申请的第一方面,本申请提供了一种操作系统中控制硬件设备的方法,包括:
[0013] 获取用于控制硬件设备动作的状态数据;
[0014] 将所述状态数据下发并存储到缓冲单元中;
[0015] 调用硬件设备驱动,所述硬件设备驱动读取保存在缓冲单元中的状态数据,根据所述状态数据控制硬件设备动作的状态;
[0016] 其中所述调用硬件设备驱动具体包括:调用已有的硬件设备驱动,以控制硬件设备动作;或者,
[0017] 获取链接库加载指令,加载链接库,所述链接库中包括用于控制硬件设备动作的功能实现函数;
[0018] 获取用于控制硬件设备动作的指令;
[0019] 调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函数;
[0020] 执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0021] 在某些实施例中,获取用于控制硬件设备动作的状态数据,具体为:获取原始数据,对原始数据编码后得到所述状态数据。
[0022] 在某些实施例中,所述硬件设备为发光器件、震动器、摄像头、传感器或麦克风。
[0023] 在某些实施例中,所述硬件设备为发光器件时,所述硬件设备驱动为发光器件驱动,所述状态数据为表示时间数据的数组;所述硬件设备驱动根据所述状态数据控制硬件设备动作的状态,具体为:发光器件驱动按照所述数组中数据元素的顺序控制发光器件开启或关闭的时间。
[0024] 在某些实施例中,所述状态数据为表示时间数据、亮度数据或强度数据的数组。
[0025] 在某些实施例中,所述操作系统为安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或Mac OS系统。
[0026] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统的内核驱动层中设置有所述硬件设备的驱动,所述硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作;或者,
[0027] 当所述操作系统为IOS系统,所述IOS系统的核心系统层中设置有所述硬件设备的驱动,所述硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0028] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统的JNI层定义有相应的JNI接口函数;
[0029] 获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数;或者,
[0030] 当所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数;
[0031] 获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应的功能实现函数,以供核心系统层的硬件设备驱动执行相应的功能实现函数。
[0032] 在某些实施例中,JNI层保存有功能实现函数实例化后的地址。
[0033] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统还包括硬件抽象层,所述安卓系统的硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和JNI层提供对硬件设备控制的接口实现;或者
[0034] 当所述操作系统为IOS系统,所述IOS系统还包括核心服务层。
[0035] 根据本申请的第二方面,本申请提供了一种操作系统中控制硬件设备的装置,包括:
[0036] 状态数据获取单元,用于获取用于控制硬件设备动作的状态数据;
[0037] 传输单元,用于将所述状态数据下发;
[0038] 缓冲单元,用于存储传输单元下发的状态数据;
[0039] 第一执行单元,用于调用硬件设备驱动,并控制所述硬件设备驱动读取保存在缓冲单元中的状态数据,根据所述状态数据控制硬件设备动作的状态;
[0040] 第一执行单元调用硬件设备驱动时,调用已有的硬件设备驱动,以控制硬件设备动作;或者,所述操作系统中控制硬件设备的装置还包括:
[0041] 加载单元,用于获取链接库加载指令,并加载链接库,所述链接库中包括用于控制硬件设备动作的功能实现函数;
[0042] 检测单元,用于获取控制硬件设备动作的指令;
[0043] 调用单元,用于调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函数;
[0044] 第二执行单元,用于控制硬件设备驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0045] 在某些实施例中,所述状态数据获取单元还包括编码子单元,用于获取原始数据,对原始数据编码后得到所述状态数据。
[0046] 在某些实施例中,所述硬件设备为发光器件、震动器、摄像头、传感器或麦克风。
[0047] 在某些实施例中,所述硬件设备为发光器件时,所述硬件设备驱动为发光器件驱动,所述状态数据为表示时间数据的数组;所述第一执行单元控制硬件设备驱动根据所述状态数据控制硬件设备的状态时:第一执行单元控制发光器件驱动按照所述数组中数据元素的顺序控制发光器件开启或关闭的时间。
[0048] 在某些实施例中,所述状态数据为表示时间数据、亮度数据或强度数据的数组。
[0049] 在某些实施例中,所述操作系统为安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或Mac OS系统。
[0050] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统的内核驱动层中设置有所述硬件设备的驱动,所述第二执行单元用于控制硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作;或者
[0051] 当所述操作系统为IOS系统时,所述IOS系统的核心系统层中设置有所述硬件设备的驱动,所述第二执行单元用于控制硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0052] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统的架构还包括JNI层,所述JNI层定义有相应的JNI接口函数;
[0053] 调用单元用于根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数;或者[0054] 所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数;
[0055] 调用单元用于根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数。
[0056] 在某些实施例中,所述JNI层保存有功能实现函数实例化后的地址。
[0057] 在某些实施例中,当所述操作系统为安卓系统时,所述安卓系统的架构还包括硬件抽象层,所述硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和JNI层提供对硬件设备控制的接口实现;或者
[0058] 当所述操作系统为IOS系统时,所述IOS系统还包括核心服务层。
[0059] 本申请提供的操作系统中控制硬件设备的方法和装置,在获取到用于控制硬件设备动作的状态数据后,先将状态数据下发并存储到缓冲单元中,之后调用硬件设备驱动,该硬件设备驱动读取保存在缓冲单元中的状态数据,根据状态数据控制硬件设备动作的状态。调用硬件设备驱动具体包括:调用已有的硬件设备驱动,以控制硬件设备动作;或者,获取链接库加载指令,加载链接库;在获取用于控制硬件设备动作的指令后,调用链接库中与硬件设备动作指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制硬件设备执行相应的动作。本申请提供的操作系统中控制硬件设备的方法和装置中,硬件设备驱动控制硬件设备执行相应的动作为直接控制方式,另外,由于状态数据存储在缓冲单元中,硬件设备驱动被调用后,便直接读取存储在缓冲单元中的状态数据,该读取过程是连续的,避免了硬件设备驱动在驱动硬件设备动作的过程中出现中断、延迟等现象,从而提高了数据传输的准确性,并为高速数据传输提供了保证。

附图说明

[0060] 图1为安卓系统的架构示意图;
[0061] 图2为本申请一种实施例提供的安卓系统的架构示意图;
[0062] 图3为本申请一种实施例提供的安卓系统的架构分析示意图;
[0063] 图4为本申请一种实施例安卓系统中控制硬件设备的方法流程示意图;
[0064] 图5为本申请一种实施例安卓系统中控制硬件设备的装置的结构示意图。

具体实施方式

[0065] 为了更好地理解本申请,本申请实施例以安卓系统中控制发光器件(闪光灯)开关为例进行说明,应当理解,本申请中所指的操作系统还可以是Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或Mac OS系统等其他操作系统。
[0066] 在本申请实施例中,通过在Linux内核空间(Linux Kernel层)实现内核驱动程序(闪光灯驱动)和在用户空间实现硬件抽象层接口,以向更上一层提供硬件访问接口,即为安卓系统的应用框架层提供硬件服务。由于安卓系统的应用程序是用Java语言编写的,硬件驱动程序是用C/C++语言来实现的,而Java提供了JNI(Java Native Interface,Java本地调用)方法调用,因此,在安卓系统中,Java应用程序可以通过JNI来调用硬件抽象层接口。
[0067] 请参考图2,本申请实施例中,将安卓系统的架构分为五层。第一层201为Linux内核驱动层(Linux kernel),第二层202为硬件抽象层(HAL,Hardware Abstraction Layer),第三层203、204为组件库层203(Libraries)和虚拟机层204(Android Runtime),第四层205为应用框架层(Application Framework),第五层206为应用程序层(Applications)。
[0068] 基于图2,请参考图3,其示出了从另一角度对安卓系统的架构的分析。可将整个安卓系统分为硬件、内核空间和用户空间三个部分,其各自包括的构架内容如图3所示。
[0069] 在本申请实施例中,将JNI层划分到第三层中,JNI层为应用框架层设计了一系列接口函数,而在这些接口函数的具体实现中,利用回调函数与硬件抽象层进行交互。
[0070] 需要说明的是,本申请实施例提供的控制闪光灯开关的方法也同样适用于图1所示架构的安卓系统,本实施例中增加硬件抽象层的作用在于,为不具有标准Linux内核驱动层接口的硬件设备提供接入的路径,将原本可读性差的接口转化成可读性好的接口,提供给上层程序调用。即硬件抽象层运行于Linux内核驱动层之上,用于在Linux内核驱动层的支持下,为应用框架层和JNI层提供对闪光灯控制的接口实现。
[0071] 图1和图2中各层的内部框架为本领域技术人员熟知的,因此,本申请不对其进行一一翻译和说明。
[0072] 本申请实施例中,还利用缓冲单元将用于控制硬件设备动作的状态数据先存储,该缓冲单元内存储的数据为硬件设备驱动可直接读取的,状态数据存储完毕后,再调用硬件设备驱动,硬件设备驱动读取保存在缓存单元中的状态数据,根据状态数据控制硬件设备动作的状态。硬件设备驱动读取缓存单元中的状态数据是连续的,不会出现时间延迟、中断等现象,从而保证了数据传输的准确性,同时也为高速数据传输提供了保证。
[0073] 本申请实施例中硬件设备可以为发光器件、震动器、摄像头、传感器或麦克风。为了便于对本申请进行说明,本申请实施例主要以硬件设备为发光器件(闪光灯)进行说明,相应的,硬件设备驱动为闪光灯驱动,状态数据为时间数据,硬件设备动作为闪光灯的开启或关闭。
[0074] 下面通过具体实施方式结合附图对本申请作进一步详细说明。
[0075] 请参考图4,本实施例提供了一种操作系统中控制硬件设备的方法,包括下面步骤:
[0076] 步骤401:获取原始数据。具体的,原始数据可以是用户输入的数据,例如用户输入的银行卡账号。在安卓系统中,可以由应用程序层获取原始数据。
[0077] 步骤402:对原始数据进行编码,以得到用于控制闪光灯开启或关闭的时间数据,例如,控制闪光灯开5s、关2s、开3s……在安卓系统中,可以由应用程序层对原始数据进行编码。
[0078] 在某些实施例中,如果用户直接输入用于控制闪光灯开启或关闭的时间数据,即原始数据便是时间数据,此时则不需要进行编码操作。
[0079] 闪光灯具体可以是电子设备中自身的光源,例如LED闪光灯;或者其他光源,例如插接在手机上的光源,可以为激光发射器或者LED。
[0080] 获取的原始数据通常为N进位制数据,对原始数据进行编码相当于将该N进位制数据编码为电信号单元,具体如下:
[0081] 将N进位制数据按位依次转换为与其对应的电信号单元,该步骤包括:将N进位制数据中每个不同的数字编码为不同的电信号单元,电信号单元内的高低电平持续时间段分别为Ti1、Ti2…和Tij,i、j、N为自然数,不同的电信号单元以分隔标志隔开,其中,本例的电信号单元内的高低电平并不默认为先高电平后低电平,也可以先低电平后高电平,高低电平之间其分隔标志可以为电平的跳变,或者以持续时间段不同的高低电平为特征电平,其分隔标志为不同于特征电平的基准电平。
[0082] 在一可选实施例中,可以对至少部分待编码的N进位制数据编码为状态不同的电平信号,按照电平信号大小分为多档,不同档表示N进位制数据中的不同数字。
[0083] 本步骤中,如果原始数据是未转换为N进位制数据的数据时,需要先将原始数据转换为N进位制数据。
[0084] 本例中,Ti2、Ti3…和Tij与Ti1的运算值为预定值或预定范围,这里的运算是指:Ti2、Ti3…和Tij与Ti1的比值、乘积、差、和、倒数、和/或算余数。
[0085] 本步骤中,以二进制数据为例,即当N=2时,将二进制数据0编码为第一电信号单元,第一电信号单元内的高低电平持续时间段分别为T11和T12;将二进制数据1编码为第二电信号单元,第二电信号单元内的高低电平持续时间段分别为T21和T22,其中,T11时间段为预设时间,T12=T11,T21=T11,T22=m*T21,m为设定的系数;或者,T11时间段为预设时间范围,T12、T11、T21在同一时间范围内,T122=m*21,m为设定的系数,最终使得T22与T21运算值不等于T12与T11运算值。
[0086] 电平的跳变是从高电平到低电平的跳变,在二进制数据中,一个电信号单元内的电平发生一次跳变,其中,高电平控制LED闪光灯发光,低电平控制LED闪光灯不发光;在其他实施例中,可以采用相反的控制方式,如:电平发生为低电平到高电平的跳变,其中,低电平控制LED闪光灯发光,高电平控制LED闪光灯不发光。
[0087] 步骤403:将时间数据下发。在安卓系统中,具体可以为:应用程序层将时间数据下发到内核驱动层。
[0088] 步骤404:将下发的时间数据存储到缓冲单元中。在安卓系统中,具体为:内核驱动层获取到应用程序层下发的时间数据后,将其存储到设置在内核驱动层的缓冲单元中。缓冲单元内存储的数据为发光器件驱动可直接读取的,缓冲单元起到暂时保存时间数据的作用,其可以是缓冲寄存器。在其他实施例中,该缓冲单元也可以是利用现有的系统存储单元,通过程序的方法将该存储单元分离出一部分或全部空间作为本实施例中的缓冲单元。
[0089] 缓冲寄存器又称缓冲器,可分为输入缓冲器和输出缓冲器两种。前者的作用是将外设送来的数据暂时存放,以便处理器将它取走;后者的作用是用来暂时存放处理器送往外设的数据。缓冲器可以使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。
[0090] 步骤405:应用框架层检测获取链接库加载指令。
[0091] 在具体实施例中,一方面,安卓系统在启动后会自动加载相应的链接库,因此,链接库加载指令可以是安卓系统在启动后发出的一个指令;另一方面,链接库只有在需要调用相应的功能实现函数时才需要进行加载,因此,链接库加载指令可以是安卓系统检测到要进行功能实现函数的调用时发出的一个指令。
[0092] 步骤406:应用框架层加载链接库,链接库中包括用于控制闪光灯动作的功能实现函数。
[0093] 功能实现函数为用于控制闪光灯动作的函数,例如:
[0094] led_on
[0095] led_off
[0096] ……
[0097] 或者当led的驱动信号需要由另外一个设备给出时,例如CPU芯片或摄像头芯片等,则需要先打开该设备,然后再驱动LED发光。这样的优势是控制灯的模式更加灵活,例如不同颜色、不同亮度等,则可以写如下函数:
[0098] led_device_open//打开闪光灯(可选,其功能是打开上述设备)
[0099] led_device_close//关闭闪光灯(可选,其功能是打开上述设备)
[0100] led_on
[0101] led_off
[0102] ……
[0103] 上述用于控制闪光灯动作的函数在定义完毕后,可以保存在.c文件里,.c文件中是所有变量和函数的定义。
[0104] 步骤407:应用程序层获取用于控制闪光灯动作的指令。该指令可以是用户通过安卓设备的人机交互界面(即应用程序层)输入的用于控制闪光灯动作的指令;也可以是应用程序层中已编码好的指令串,例如用“0”和“1”表示的数据串,其中,“0”表示闪光灯关闭,“1”表示闪光灯打开。
[0105] 基于步骤301,步骤303中用于控制闪光灯动作的指令也可以作为链接库加载指令,用于控制闪光灯动作的指令即可理解为要进行功能实现函数的调用,因此,需要说明的是,本实施例中提供的方法的步骤顺序不应该理解为对本申请的限定,在其他实施例中,其步骤顺序可以根据实际情况进行适当的变换。
[0106] 步骤408:应用程序层检测链接库是否加载完毕,如果否,则继续待链接库加载完毕,如果是,则继续步骤409。
[0107] 步骤409:应用程序层调用链接库中与用于控制闪光灯动作的指令对应的功能实现函数。
[0108] 应用程序层可以在检测到链接库全部加载完毕时调用功能实现函数,或者在检测的同时即进行调用,或者可以设定预定的时间,当满足一定的预定时间时,便调用功能实现函数。
[0109] 步骤410:Linux内核驱动层执行被调用的功能实现函数,以控制闪光灯执行相应的动作。
[0110] 本实施例中,Linux内核驱动层中设置有闪光灯驱动,闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作。
[0111] 步骤411:闪光灯驱动读取保存在缓冲单元中的时间数据。
[0112] 步骤412:闪光灯驱动读取时间数据后,根据时间数据控制发光器件开启或关闭的时间。
[0113] 目前,闪光灯通常只用于作为camera的辅助硬件,只有在使用camera时,才有可能会使用到闪光灯,因此,安卓系统中在使用闪光灯时,必须先调用camera driver,通过设置camera参数来实现闪光灯的控制。即,对闪光灯的控制为间接控制的方式。
[0114] 在通过camera driver控制闪光灯时会出现时间延迟的问题,但对于目前闪光灯的应用范围,该时间延迟不会影响正常的使用。然而,随着光通信(例如可见光通信)的发展,当需要通过光进行信息传输时,由于光通信对传输速度及信息传输准确性的要求,上述时间延迟的问题便逐渐突显出来,并成为光通信发展的障碍之一。
[0115] 本实施例中,在安卓系统的Linux内核驱动层中独立设置有闪光灯驱动,在控制闪光灯时,可以直接调用闪光灯驱动,其对闪光灯的控制方式为直接控制。可以避免在通过camera driver控制闪光灯时出现的时间延迟。
[0116] 需要说明的是,步骤405-步骤409为本实施例提供的一种硬件设备驱动(闪光灯驱动)调用方式,属于直接控制的方式。在其他实施例中,可以采用现有技术中的任一种方式调用已有的硬件设备驱动,以控制硬件设备动作,例如采用上述间接控制的方式。
[0117] JNI层定义有接口函数。应用程序层根据JNI层的接口函数调用链接库中与控制闪光灯动作的指令对应的功能实现函数,以供Linux内核驱动层的闪光灯驱动执行相应的功能实现函数。
[0118] 当操作系统为IOS系统,则syscall为本地化接口处,可实现安卓系统中JNI层定义有接口函数的作用,此处不再赘述。
[0119] JNI层的接口函数定义了C/C++函数与JAVA函数的对应关系,该接口函数采用JNI方法将硬件抽象层的C/C++函数映射到应用程序层的JAVA函数上,以实现硬件抽象层(采用C/C++语言)与应用程序层(采用JAVA语言)的交互。led_on为JAVA函数,只有通过JNI接口的映射才能调用底层的功能函数,它会在JNI层中映射成名为java_全包名_类名_led_on的本地函数,再在函数里调用底层功能函数。
[0120] 安卓运行环境中的Dalvik虚拟机在调用一个成员函数时,如果发现该成员函数是一个JNI方法,那么就会直接跳到它的地址去执行。即,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行。因此,JNI方法是安卓应用程序与本地操作系统直接进行通信的一个手段,通过JNI方法使得通信更加高效。
[0121] 优选的,JNI层保存有功能实现函数实例化后的地址,以便于JNI层直接调用功能实现函数。实例化是指在面向对象的编程中,用类(Class)创建对象的过程。例如:在闪光灯的控制过程中,将闪光灯动作作为类,将开启闪光灯、关闭闪光灯等具体的功能实现函数创建为对象。该对象的创建过程,即为实例化。该对象创建完后会有一对应的地址,JNI层保存该地址后,在后续调用该功能实现函数时,即可以根据该地址快速查询到相应的对象,而不需要先检索该功能实现函数对应的类。
[0122] 本实施例中,在硬件抽象层定义有下面三个结构体:
[0123] struct hw_module_t;//模块类型:每一个硬件模块的必须申明一个hal_module_info_sym的数据结构体,该结构体的第一个成员必须是以hw_module_t为数据的结构体。
[0124] struct hw_module_methods_t;//模块方法:该结构体仅提供一个打开特殊设备的open函数的接口,其传入参数为“hw_module_t,id”和“w_device_t”,该函数用于初始化hw_device_t的各个成员。
[0125] strcut hw_device_t.//设备类型:对于每一个设备数据结构体都必须以该结构体开头,该结构体是所有设备的引导线,在该结构体之后才是每一个设备自己的数据。
[0126] 本实施例中,在定义硬件模块类型结构体时,硬件抽象层规定不能直接使用hw_module_t结构体,需要做一个继承,即在该结构体外再套一层结构体,但hw_module_t结构体必须是该结构体的第一个成员变量数据类型,以方便两者之间的强制转换。其部分程序代码可参考如下:
[0127]
[0128]
[0129] 定义结构体的作用:把相关的变量与功能打包在一起,代码进行封装,以避免随意被更改。结构体是一种优选的方式,并不是必须的。
[0130] 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体用来封装一些属性、参数等值(即数据成员),以组成新的类型,封装后使得该属性、参数等值可以被多次利用。
[0131] 对于闪光灯驱动,其定义的结构体可以包括闪光灯亮度、闪光灯开/关时间等,而亮度值、开/关时间则作为数据成员被封装在相应类别的结构体中。另外,对于采用C++定义的结构体,其数据成员还可以为函数,不仅可以用于描述对象的状态,还可以用于描述对象的行为,例如控制闪光灯开/关的函数LED_ON,LED_OFF,LED_DEVICE_OPEN,LED_DEVICE_CLOSE,它们分别对应前述的led_on,led_off,led_device_open,led_device_close函数。
[0132] 在某些实施例中,时间数据为一数组。闪光灯驱动根据时间数据控制闪光灯开启或关闭的时间,具体为:发光器件驱动按照数组中数据元素的顺序控制闪光灯开启或关闭的时间。当然,在其他实施例中,时间数据的格式也可以采用现有技术中其他可行的方式。
[0133] 本实施例提供操作系统中控制闪光灯的方法中,利用缓冲单元将用于控制闪光灯开启或关闭的时间数据先存储,时间数据存储完毕后,再调用发光器件驱动,闪光灯驱动读取保存在缓存器中的时间数据,根据时间数据控制闪光灯开启或关闭的时间。闪光灯驱动读取缓存器中的时间数据是连续的,不会出现时间延迟现象,从而保证了数据传输的准确性,同时也为光通信的高速数据传输提供了保证。
[0134] 需要说明的是,本实施例中的操作系统可以是安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统、Mac OS系统等,虽然各个系统存在着差异,但为了实现本实施例控制发光器件的方法,在本发明的构思下,本领域技术人员可以通过适当的改变以达到目的。
[0135] 在某些实施例中,状态数据还可以是用于控制闪光灯发光强度的强度数据。在其他实施例中,如果硬件设备为震动器,相应的,状态数据也可以是用于控制震动器震动强度的强度数据。对于其他硬件设备,其实现原理与闪光灯的实现原理一致,本实施例不再赘述。
[0136] 请参考图5,对应于本实施例提供的操作系统中控制硬件设备的方法,本实施例还提供了一种操作系统中控制硬件设备的装置,包括状态数据获取单元501、传输单元502、缓冲单元503、加载单元504、检测单元505、调用单元506、第一执行单元508和第二执行单元507。
[0137] 状态数据获取单元501用于获取用于控制硬件设备动作的状态数据。
[0138] 传输单元502用于将状态数据下发。
[0139] 缓冲单元503用于存储传输单元502下发的状态数据。
[0140] 第一执行单元508用于调用硬件设备驱动,并控制硬件设备驱动读取保存在缓冲单元503中的状态数据,根据该状态数据控制硬件设备动作的状态。
[0141] 加载单元504用于获取链接库加载指令,并加载链接库,链接库中包括用于控制硬件设备动作的功能实现函数。
[0142] 检测单元505用于获取控制硬件设备动作的指令。
[0143] 调用单元506用于调用链接库中与控制硬件设备动作的指令对应的功能实现函数。
[0144] 第二执行单元507用于控制硬件设备驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0145] 在具体实施例中,状态数据获取单元501还包括编码子单元5010,用于获取原始数据,对原始数据编码后得到状态数据。
[0146] 在具体实施例中,硬件设备为发光器件、震动器、摄像头、传感器或麦克风。
[0147] 在具体实施例中,硬件设备为发光器件时,硬件设备驱动为发光器件驱动,状态数据为表示时间数据的数组;第一执行单元508控制硬件设备驱动根据状态数据控制硬件设备的状态时:第一执行单元508控制发光器件驱动按照数组中数据元素的顺序控制发光器件开启或关闭的时间。
[0148] 在具体实施例中,状态数据为表示时间数据、亮度数据或强度数据的数组。
[0149] 在具体实施例中,操作系统为安卓系统、Blackberry OS系统、windows phone系统、windows mobile系统、IOS系统或Mac OS系统。
[0150] 在具体实施例中,当操作系统为安卓系统时,安卓系统的内核驱动层中设置有硬件设备的驱动,第二执行单元507用于控制硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作;或者,当操作系统为IOS系统时,IOS系统的核心系统层中设置有硬件设备的驱动,第二执行单元507用于控制硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0151] 在具体实施例中,当操作系统为安卓系统时,安卓系统的架构还包括JNI层,JNI层定义有相应的JNI接口函数;调用单元506用于根据接口函数调用链接库中与控制硬件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数;或者,操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数;调用单元506用于根据接口函数调用链接库中与控制硬件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数。
[0152] 在具体实施例中,JNI层保存有功能实现函数实例化后的地址。
[0153] 在具体实施例中,当操作系统为安卓系统时,安卓系统的架构还包括硬件抽象层,硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和JNI层提供对硬件设备控制的接口实现;或者,当操作系统为IOS系统时,IOS系统还包括核心服务层。
[0154] 需要说明的是,本实施例中,加载单元504、检测单元505、调用单元506、第二执行单元507对硬件设备驱动(闪光灯驱动)调用方式属于直接控制的方式。在其他实施例中,第一执行单元508可以采用现有技术中的任一种方式调用已有的硬件设备驱动,以控制硬件设备动作,例如采用间接控制的方式。
[0155] 本实施例提供的操作系统中控制硬件设备的装置与上述控制硬件设备的方法对应,此处不再对其工作原理进行赘述。
[0156] 本申请实施例提供的操作系统中控制硬件设备的方法和装置,在获取到用于控制硬件设备动作的状态数据后,先将状态数据下发并存储到缓冲单元中,之后调用硬件设备驱动,该硬件设备驱动读取保存在缓冲单元中的状态数据,根据状态数据控制硬件设备动作的状态。调用硬件设备驱动具体包括:调用已有的硬件设备驱动,以控制硬件设备动作;或者,获取链接库加载指令,加载链接库;在获取用于控制硬件设备动作的指令后,调用链接库中与硬件设备动作指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制硬件设备执行相应的动作。本申请提供的操作系统中控制硬件设备的方法和装置中,硬件设备驱动控制硬件设备执行相应的动作为直接控制方式,另外,由于状态数据存储在缓冲单元中,硬件设备驱动被调用后,便直接读取存储在缓冲单元中的状态数据,该读取过程是连续的,避免了硬件设备驱动在驱动硬件设备动作的过程中出现中断、延迟等现象,从而提高了数据传输的准确性,并为高速数据传输提供了保证。
[0157] 本领域技术人员可以理解,上述实施方式中各种方法的全部或部分步骤可以通过程序来指令相关硬件完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器、随机存取存储器、磁盘或光盘等。
[0158] 以上内容是结合具体的实施方式对本申请所作的进一步详细说明,不能认定本申请的具体实施只局限于这些说明。对于本申请所属技术领域的普通技术人员来说,在不脱离本申请发明构思的前提下,还可以做出若干简单推演或替换。