操作系统中直接控制硬件设备的方法和模块的制作方法

文档序号:6624268阅读:1186来源:国知局
操作系统中直接控制硬件设备的方法和模块的制作方法
【专利摘要】一种操作系统中直接控制硬件设备的方法和模块,其中,先获取链接库加载指令,加载链接库■’在获取用于控制硬件设备动作的指令后,调用链接库中与硬件设备动作指令对应的功能实现函数;之后执行被调用的功能实现函数,以控制硬件设备执行相应的动作,从而实现对硬件设备的直接控制。
【专利说明】操作系统中直接控制硬件设备的方法和模块

【技术领域】
[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] 当所述操作系统为I0S系统,则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 hwm_odule_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]

【权利要求】
1. 一种操作系统中直接控制硬件设备的方法,其特征在于,包括: 获取链接库加载指令,加载链接库,所述链接库中包括用于控制硬件设备动作的功能 实现函数; 获取用于控制硬件设备动作的指令; 调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函数; 执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
2.如权利要求1所述的方法,其特征在于,当所述操作系统为安卓系统时,所述安卓系 统的内核驱动层中设置有所述硬件设备的驱动,所述硬件设备的驱动执行被调用的功能实 现函数,以控制硬件设备执行相应的动作;或者, 当所述操作系统为IOS系统,所述IOS系统的核心系统层中设置有所述硬件设备的驱 动,所述硬件设备的驱动执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
3.如权利要求2所述的方法,其特征在于,当所述操作系统为安卓系统时,所述安卓系 统的JNI层定义有相应的JNI接口函数; 获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库中与控制硬 件设备动作的指令对应的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能 实现函数;或者, 当所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函 数; 获取链接库加载指令,加载链接库后,根据所述接口函数调用所述链接库中与控制硬 件设备动作的指令对应的功能实现函数,以供核心系统层的硬件设备驱动执行相应的功能 实现函数。
4.如权利要求3所述的方法,其特征在于,JNI层保存有功能实现函数实例化后的地 址。
5.如权利要求3所述的方法,其特征在于,当所述操作系统为安卓系统时,所述安卓系 统还包括硬件抽象层,所述安卓系统的硬件抽象层运行于内核驱动层之上,用于在内核驱 动层的支持下,为安卓系统的应用框架层和JNI层提供对硬件设备控制的接口实现;或者 当所述操作系统为IOS系统,所述IOS系统还包括核心服务层。
6.如权利要求1-5任一项所述的方法,其特征在于,所述硬件设备为闪光灯、摄像头、 传感器或麦克风。
7. 一种操作系统中直接控制硬件设备的模块,其特征在于,包括: 加载单元,用于获取链接库加载指令,并加载链接库,所述链接库中包括用于控制硬件 设备动作的功能实现函数; 检测单元,用于获取控制硬件设备动作的指令; 调用单元,用于调用所述链接库中与所述控制硬件设备动作的指令对应的功能实现函 数; 执行单元,用于执行被调用的功能实现函数,以控制硬件设备执行相应的动作。
8.如权利要求7所述的模块,其特征在于,当所述操作系统为安卓系统时,所述安卓系 统的内核驱动层中设置有所述硬件设备的驱动,所述执行单元用于控制硬件设备的驱动执 行被调用的功能实现函数,以控制硬件设备执行相应的动作;或者 当所述操作系统为IOS系统时,所述IOS系统的核心系统层中设置有所述硬件设备的 驱动,所述执行单元用于控制硬件设备的驱动执行被调用的功能实现函数,以控制硬件设 备执行相应的动作。
9.如权利要求8所述的模块,其特征在于,当所述操作系统为安卓系统时,所述安卓系 统的架构还包括JNI层,所述JNI层定义有相应的JNI接口函数; 调用单元用于根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应 的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数;或者 所述操作系统为IOS系统时,则利用LibSystem库访问核心系统层提供的接口函数; 调用单元用于根据所述接口函数调用所述链接库中与控制硬件设备动作的指令对应 的功能实现函数,以供内核驱动层的硬件设备驱动执行相应的功能实现函数。
10.如权利要求9所述的模块,其特征在于,所述JNI层保存有功能实现函数实例化后 的地址。
11.如权利要求9所述的模块,其特征在于,当所述操作系统为安卓系统时,所述安卓 系统的架构还包括硬件抽象层,所述硬件抽象层运行于内核驱动层之上,用于在内核驱动 层的支持下,为安卓系统的应用框架层和JNI层提供对硬件设备控制的接口实现;或者 当所述操作系统为IOS系统时,所述IOS系统还包括核心服务层。
12.如权利要求7-11任一项所述的模块,其特征在于,所述硬件设备为闪光灯、摄像 头、传感器或麦克风。
【文档编号】G06F9/44GK104216709SQ201410415227
【公开日】2014年12月17日 申请日期:2014年8月20日 优先权日:2014年8月20日
【发明者】不公告发明人 申请人:深圳光启创新技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1