zoukankan      html  css  js  c++  java
  • 硬件抽象层——HAL

    (一)为什么要在android中加入HAL

    Linux系统中Linux驱动有两种类型的代码:访问硬件寄存器的代码——调用的Linux内核的标准函数进行的标准操作

                         业务逻辑代码——有些企业或个人并不想将源代码公开

    Google为了满足这些不想开源的Linux驱动作者的要求,在android层次结构中的系统运行库增加了一个HAL,注意HAL并不是Linux内核的一部分。

    主要目的:统一硬件的调用接口

         解决了GPL版权问题

          针对一些特殊的要求

    (二)Android HAL架构

    调用HAL模块的代码并不需要直接装载.so文件,而只需要通过一个ID来定位相应的.so文件(这里叫做Stub)。在Stub和JNI之间还有一层Service程序库,该层的库文件使用android系统提供的调用HAL的机制访问HAL中的Service程序库(就是在这一层通过ID定位了HAL Library),然后Android应用程序再调用Service程序库。

    (了解)(三)为LED驱动增加HAL

     应用程序不需要再关心Linux驱动和设备文件的交互方式,只需要像访问普通API一样就可以和Linux驱动进行交互,此次将所有业务逻辑从LED驱动移到HAL模块,LED驱动只保留读写寄存器的功能。

    (1)编写一款支持HAL的Linux驱动程序的步骤:1.编写Linux驱动   Linux驱动的代码尽量简洁,尽可能将业务逻辑放到HAL Library中

                                                                   2.编写HAL Library  这类库文件有一个接口,通过HAL_MODULE_INFO_SYM变量实现,Service Library就是通过这个接口中定义的ID定位HAL Library的

                                                                   3.编写Service Library 

    (2)精简LED驱动:实现LED驱动在设备文件的read和write函数中读写指定的寄存器。基本原理是只从指定寄存器读取或写入5个字节。第一个字节用于指定读写的动作以及寄存器类型。后4个字节是读写的实际的数据。在与LED驱动交互时,只要想设备文件读取或发送5个字节的数据,就可以读写指定的寄存器。

    (3)测试读写寄存器操作:在编写Linux驱动以及与驱动相关的程序的过程中应分段测试每一部分程序,以便将当前编写的程序的Bug降到最低

    (4)编写调用LED驱动的HAL模块:HAL模块中包含了LED驱动的所有业务逻辑,实际上,HAL模块也是普通的Linux共享库,只不过HAL模块可以被Android系统自动装载,而不是开发人员自己去装载.so文件。任何被系统自动调用的程序都会有一个标准的接口。例如,C语言可执行程序都会有一个main函数,系统在运行程序时会试想执行main函数。Linux驱动init函数与main函数的性质类似。在装载Linux驱动的过程中系统会调用init函数。HAL模块有一个固定名称的结构体变量HAL_MODULE_INFO_SYM ,因此可以被android系统自动调用。

             编写HAL模块的步骤和原理如下:

          第1步:定义结构体和宏

                     3个重要的结构体hw_module_t、hw_device_t、hw_module_methods_t

           第2步:编写HAL模块的open函数

                     Open函数是HAL模块的入口点。初始化hw_device_t的子结构体;打开设备文件;初始化寄存器

           第3步:定义hw_module_methods_t结构体变量

                     HAL模块需要hw_module_methods_t结构体的open函数指针变量指定open入口函数

           第4步:定义HAL_MODULE_INFO_SYM变量

                     id表示HAL模块中Android系统中的标识。通过id找到并装载HAL模块。

                     methods变量需要指向第3步定义的hw_module_methods_t结构体的地址,当调用者通过id找到并装载HAL模块后,就会通过methods变量找到hw_module_methods_t结构体,并调用hw_module_methods_t.open函数。

           第5步:编写HAL模块的close函数

                     当HAL模块被卸载后会调用close函数

           第6步:编写控制LED的函数

                    根据设备类型和功能的不同,编写相应的函数

          

    (5)编写调用HAL模块的Service

    (6)HAL模块的存放路径和命名规则

           HAL模块通常存放在/system/lib/hw目录。文件名一般都有一个default。

    (三)小结

           在Android系统中使用驱动有两种方式:一种是通过传统的方式直接与Linux驱动交互;另一种是Android特有的,就是通过HAL模块。高版本的Android系统为HAL增加了Stub,为每一个HAL共享库指定一个ID,再利用这个ID配合一定的规则找到Linux共享库。

  • 相关阅读:
    如何了解网络链路的性能,吞吐量测试
    Struts+Spring+HibernateSSH整合实例
    在百度贴吧打出被和谐的字和特殊字符:比如繁体字
    SVN 小记
    SVN 小记
    SVN needslock 设置强制只读属性
    在百度贴吧打出被和谐的字和特殊字符:比如繁体字
    TortoiseSVN与Subversion 1.5
    .NET中非对称加密RSA算法的密钥保存
    SVN needslock 设置强制只读属性
  • 原文地址:https://www.cnblogs.com/xiansheng/p/5591793.html
Copyright © 2011-2022 走看看