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

申请号 : CN201410415227.2

文献号 : CN104216709B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 不公告发明人

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

摘要 :

一种操作系统中直接控制硬件设备的方法和装置,其中,先获取链接库加载指令,加载链接库;在获取用于控制硬件设备动作的指令后,调用链接库中与硬件设备动作指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制硬件设备执行相应的动作,从而实现对硬件设备的直接控制。

权利要求 :

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

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

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

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

通过调用独立设置的闪光灯驱动来执行被调用的功能实现函数,以控制闪光灯执行相应的动作。

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

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

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

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

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

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

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

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

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

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

闪光灯驱动,用于直接控制闪光灯;

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

7.如权利要求6所述的装置,其特征在于,当所述操作系统为安卓系统时,所述安卓系统的内核驱动层中设置有所述闪光灯驱动,所述执行单元用于控制闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作;或者当所述操作系统为IOS系统时,所述IOS系统的核心系统层中设置有所述闪光灯的驱动,所述执行单元用于控制闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作。

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

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

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

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

10.如权利要求8所述的装置,其特征在于,当所述操作系统为安卓系统时,所述安卓系统的架构还包括硬件抽象层,所述硬件抽象层运行于内核驱动层之上,用于在内核驱动层的支持下,为安卓系统的应用框架层和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] 目前,众多的电子设备采用安卓系统,且设备硬件上都安装有闪光灯,在很多情况下,用户具有使用闪光灯的需求,因此,如何在安卓系统上实现闪光灯的控制,是本领域技术人员正在研究的问题。在安卓系统中,当需要控制闪光灯的开关时,通常是先调用camera driver,利用camera自带的接口,通过设置camera的参数,来实现闪光灯的开关。而这种对闪光灯的控制方式,属于间接控制,其对闪光灯的调用具有一定的时间延迟。

发明内容

[0008] 根据本申请的第一方面,本申请提供了一种操作系统中直接控制硬件设备的方法,包括:
[0009] 获取链接库加载指令,加载链接库,所述链接库中包括用于控制硬件设备动作的功能实现函数;
[0010] 获取用于控制硬件设备动作的指令;
[0011] 调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函数;
[0012] 执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0013] 根据本申请的第二方面,本申请还提供了一种操作系统中直接控制硬件设备的装置,包括:
[0014] 加载单元,用于获取链接库加载指令,并加载链接库,所述链接库中包括用于控制硬件设备动作的功能实现函数;
[0015] 检测单元,用于获取控制硬件设备动作的指令;
[0016] 调用单元,用于调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函数;
[0017] 执行单元,用于执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
[0018] 本申请提供的操作系统中直接控制硬件设备的方法和装置中,先获取链接库加载指令,加载链接库;在获取用于控制硬件设备动作的指令后,调用链接库中与硬件设备动作指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制硬件设备执行相应的动作,从而实现对硬件设备的直接控制。

附图说明

[0019] 图1为安卓系统的架构示意图;
[0020] 图2为本申请一种实施例提供的安卓系统的架构示意图;
[0021] 图3为本申请一种实施例提供的安卓系统的架构分析示意图;
[0022] 图4为本申请一种实施例中安卓系统中直接控制闪光灯开关的方法的流程示意图;
[0023] 图5为本申请一种实施例中安卓系统中直接控制闪光灯开关的装置的结构示意图。

具体实施方式

[0024] 为了更好地理解本申请,本申请实施例以安卓系统中直接控制闪光灯开关为例进行说明,应当理解,本申请中所指的操作系统还可以是ios、mac os等其他操作系统,硬件设备还可以是电子设备中摄像头、蓝牙、传感器、麦克风等。
[0025] 下面通过具体实施例对本申请做进一步说明。
[0026] 在本申请实施例中,通过在Linux内核空间(Linux Kernel层)实现内核驱动程序(闪光灯驱动)和在用户空间实现硬件抽象层接口,以向更上一层提供硬件访问接口,即为安卓系统的应用框架层提供硬件服务。由于安卓系统的应用程序是用Java语言编写的,硬件驱动程序是用C/C++语言来实现的,而Java提供了JNI(Java Native Interface,Java本地调用)方法调用,因此,在安卓系统中,Java应用程序可以通过JNI来调用硬件抽象层接口。
[0027] 请参考图2,本实施例中,将安卓系统的架构分为五层。第一层201为Linux内核驱动层(Linux kernel),第二层202为硬件抽象层(HAL,Hardware Abstraction Layer),第三层203、204为组件库层203(Libraries)和虚拟机层204(Android Runtime),第四层205为应用框架层(Application Framework),第五层206为应用程序层(Applications)。
[0028] 基于图2,请参考图3,其示出了从另一角度对安卓系统的架构的分析。可将整个安卓系统分为硬件、内核空间和用户空间三个部分,其各自包括的构架内容如图3所示。
[0029] 在本实施例中,将JNI层划分到第三层中,JNI层为应用框架层设计了一系列接口函数,而在这些接口函数的具体实现中,利用回调函数与硬件抽象层进行交互。
[0030] 需要说明的是,本申请实施例提供的直接控制闪光灯开关的方法也同样适用于图1所示架构的安卓系统,本实施例中增加硬件抽象层的作用在于,为不具有标准Linux内核驱动层接口的硬件设备提供接入的路径,将原本可读性差的接口转化成可读性好的接口,提供给上层程序调用。即硬件抽象层运行于Linux内核驱动层之上,用于在Linux内核驱动层的支持下,为应用框架层和JNI层提供对闪光灯控制的接口实现。
[0031] 图1和图2中各层的内部框架为本领域技术人员熟知的,因此,本申请不对其进行一一翻译和说明。
[0032] 请参考图4,本实施例提供了一种安卓系统中直接控制闪光灯开关的方法,包括下面步骤:
[0033] 步骤301:应用框架层检测获取链接库加载指令。
[0034] 在具体实施例中,一方面,安卓系统在启动后会自动加载相应的链接库,因此,链接库加载指令可以是安卓系统在启动后发出的一个指令;另一方面,链接库只有在需要调用相应的功能实现函数时才需要进行加载,因此,链接库加载指令可以是安卓系统检测到要进行功能实现函数的调用时发出的一个指令。
[0035] 步骤302:应用框架层加载链接库,链接库中包括用于控制闪光灯动作的功能实现函数。
[0036] 功能实现函数为用于控制闪光灯动作的函数,例如:
[0037] led_on
[0038] led_off
[0039] ……
[0040] 或者当led的驱动信号需要由另外一个设备给出时,例如CPU芯片或摄像头芯片等,则需要先打开该设备,然后再驱动LED发光。这样的优势是控制灯的模式更加灵活,例如不同颜色、不同亮度等,则可以写如下函数:
[0041] led_device_open//打开闪光灯(可选,其功能是打开上述设备)
[0042] led_device_close//关闭闪光灯(可选,其功能是打开上述设备)
[0043] led_on
[0044] led_off
[0045] ……
[0046] 上述用于控制闪光灯动作的函数在定义完毕后,可以保存在.c文件里,.c文件中是所有变量和函数的定义。
[0047] 步骤303:应用程序层获取用于控制闪光灯动作的指令。该指令可以是用户通过安卓设备的人机交互界面(即应用程序层)输入的用于控制闪光灯动作的指令;也可以是应用程序层中已编码好的指令串,例如用“0”和“1”表示的数据串,其中,“0”表示闪光灯关闭,“1”表示闪光灯打开。
[0048] 基于步骤301,步骤303中用于控制闪光灯动作的指令也可以作为链接库加载指令,用于控制闪光灯动作的指令即可理解为要进行功能实现函数的调用,因此,需要说明的是,本实施例中提供的方法的步骤顺序不应该理解为对本申请的限定,在其他实施例中,其步骤顺序可以根据实际情况进行适当的变换。
[0049] 步骤304:应用程序层检测链接库是否加载完毕,如果否,则继续待链接库加载完毕,如果是,则继续步骤305。
[0050] 步骤305:应用程序层调用链接库中与用于控制闪光灯动作的指令对应的功能实现函数。
[0051] 应用程序层可以在检测到链接库全部加载完毕时调用功能实现函数,或者在检测的同时即进行调用,或者可以设定预定的时间,当满足一定的预定时间时,便调用功能实现函数。
[0052] 步骤306:Linux内核驱动层执行被调用的功能实现函数,以控制闪光灯执行相应的动作。
[0053] 本实施例中,Linux内核驱动层中设置有闪光灯驱动,闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作。
[0054] 目前,闪光灯通常只用于作为camera的辅助硬件,只有在使用camera时,才有可能会使用到闪光灯,因此,安卓系统中在使用闪光灯时,必须先调用camera driver,通过设置camera参数来实现闪光灯的控制。即,对闪光灯的控制为间接控制的方式。
[0055] 在通过camera driver控制闪光灯时会出现时间延迟的问题,但对于目前闪光灯的应用范围,该时间延迟不会影响正常的使用。然而,随着光通信(例如可见光通信)的发展,当需要通过光进行信息传输时,由于光通信对传输速度及信息传输准确性的要求,上述时间延迟的问题便逐渐突显出来,并成为光通信发展的障碍之一。
[0056] 本实施例中,在安卓系统的Linux内核驱动层中独立设置有闪光灯驱动,在控制闪光灯时,可以直接调用闪光灯驱动,其对闪光灯的控制方式为直接控制。可以避免在通过camera driver控制闪光灯时出现的时间延迟。
[0057] JNI层定义有接口函数。应用程序层根据JNI层的接口函数调用链接库中与控制闪光灯动作的指令对应的功能实现函数,以供Linux内核驱动层的闪光灯驱动执行相应的功能实现函数。
[0058] 当所述操作系统为IOS系统,则syscall为本地化接口处,可实现安卓系统中JNI层定义有接口函数的作用,此处不再赘述。
[0059] JNI层的接口函数定义了C/C++函数与JAVA函数的对应关系,该接口函数采用JNI方法将硬件抽象层的C/C++函数映射到应用程序层的JAVA函数上,以实现硬件抽象层(采用C/C++语言)与应用程序层(采用JAVA语言)的交互。led_on为JAVA函数,只有通过JNI接口的映射才能调用底层的功能函数,它会在JNI层中映射成名为java_全包名_类名_led_on的本地函数,再在函数里调用底层功能函数。
[0060] 安卓运行环境中的Dalvik虚拟机在调用一个成员函数时,如果发现该成员函数是一个JNI方法,那么就会直接跳到它的地址去执行。即,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行。因此,JNI方法是安卓应用程序与本地操作系统直接进行通信的一个手段,通过JNI方法使得通信更加高效。
[0061] 优选的,JNI层保存有功能实现函数实例化后的地址,以便于JNI层直接调用功能实现函数。实例化是指在面向对象的编程中,用类(Class)创建对象的过程。例如:在闪光灯的控制过程中,将闪光灯动作作为类,将开启闪光灯、关闭闪光灯等具体的功能实现函数创建为对象。该对象的创建过程,即为实例化。该对象创建完后会有一对应的地址,JNI层保存该地址后,在后续调用该功能实现函数时,即可以根据该地址快速查询到相应的对象,而不需要先检索该功能实现函数对应的类。
[0062] 本实施例中,在硬件抽象层定义有下面三个结构体:
[0063] struct hw_module_t;//模块类型:每一个硬件模块的必须申明一个hal_module_info_sym的数据结构体,该结构体的第一个成员必须是以hw_module_t为数据的结构体。
[0064] struct hw_module_methods_t;//模块方法:该结构体仅提供一个打开特殊设备的open函数的接口,其传入参数为“hw_module_t,id”和“w_device_t”,该函数用于初始化hw_device_t的各个成员。
[0065] strcut hw_device_t.//设备类型:对于每一个设备数据结构体都必须以该结构体开头,该结构体是所有设备的引导线,在该结构体之后才是每一个设备自己的数据。
[0066] 本实施例中,在定义硬件模块类型结构体时,硬件抽象层规定不能直接使用hw_module_t结构体,需要做一个继承,即在该结构体外再套一层结构体,但hw_module_t结构体必须是该结构体的第一个成员变量数据类型,以方便两者之间的强制转换。其部分程序代码可参考如下:
[0067]
[0068] 定义结构体的作用:把相关的变量与功能打包在一起,代码进行封装,以避免随意被更改。结构体是一种优选的方式,并不是必须的。
[0069] 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体用来封装一些属性、参数等值(即数据成员),以组成新的类型,封装后使得该属性、参数等值可以被多次利用。
[0070] 对于闪光灯驱动,其定义的结构体可以包括闪光灯亮度、闪光灯开/关时间等,而亮度值、开/关时间则作为数据成员被封装在相应类别的结构体中。另外,对于采用C++定义的结构体,其数据成员还可以为函数,不仅可以用于描述对象的状态,还可以用于描述对象的行为,例如控制闪光灯开/关的函数LED_ON,LED_OFF,LED_DEVICE_OPEN,LED_DEVICE_CLOSE,它们分别对应前述的led_on,led_off,led_device_open,led_device_close函数。
[0071] 请参考图5,对应于上述安卓系统中直接控制闪光灯开关的方法,本实施例还相应提供了一种安卓系统中直接控制闪光灯开关的装置,包括加载单元401、检测单元402、调用单元403和执行单元404。
[0072] 加载单元401用于获取链接库加载指令,并加载链接库,链接库中包括用于控制闪光灯动作的功能实现函数。
[0073] 检测单元402用于获取控制闪光灯动作的指令。
[0074] 调用单元403检测到加载单元401加载完动态链接库后,调用所述链接库中与控制闪光灯动作的指令对应的功能实现函数,或者在检测的同时即进行调用,或者可以设定预定的时间,当满足一定的预定时间时,便调用链接库。
[0075] 执行单元404用于执行被调用的功能实现函数,以控制闪光灯执行相应的动作。在具体实施例中,安卓系统的架构包括应用程序层、应用框架层、组件库和虚拟机层、Linux内核驱动层。Linux内核驱动层中设置有闪光灯驱动,执行单元404用于控制Linux内核驱动层中的闪光灯驱动执行被调用的功能实现函数,以控制闪光灯执行相应的动作。
[0076] 安卓系统的架构还包括JNI层,JNI层定义有接口函数。加载单元401用于控制应用框架层检测获取到链接库加载指令后,加载链接库。调用单元403用于控制应用程序层根据JNI层的接口函数调用链接库中与控制闪光灯动作的指令对应的功能实现函数,以供Linux内核驱动层的闪光灯驱动执行相应的功能实现函数。
[0077] 进一步,JNI层保存有功能实现函数实例化后的地址。
[0078] 优选的,安卓系统的架构还包括硬件抽象层,硬件抽象层运行于Linux内核驱动层之上,用于在Linux内核驱动层的支持下,为应用框架层和JNI层提供对闪光灯控制的接口实现。
[0079] 当操作系统为IOS系统时,IOS系统还包括Library库适配,可以实现类同安卓系统的架构中硬件抽象层的作用,此处不再赘述。
[0080] 本申请实施例提供的安卓系统中直接控制闪光灯开关的方法和装置中,先在检测获取到链接库加载指令后,加载链接库;在获取用于控制闪光灯动作的指令后,调用链接库中与该指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制闪光灯执行相应的动作,从而实现对闪光灯开关的直接控制。
[0081] 本申请实施例提供的安卓系统中直接控制闪光灯开关的方法和装置还可以扩展应用至WP操作系统,具体的实现类同,不再赘述。
[0082] 本领域技术人员可以理解,上述实施方式中各种方法的全部或部分步骤可以通过程序来指令相关硬件完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器、随机存储器、磁盘或光盘等。
[0083] 以上内容是结合具体的实施方式对本申请所作的进一步详细说明,不能认定本申请的具体实施只局限于这些说明。对于本申请所属技术领域的普通技术人员来说,在不脱离本申请发明构思的前提下,还可以做出若干简单推演或替换。