代码改变世界

第九章

2016-07-08 10:21  1010101010  阅读(227)  评论(0编辑  收藏  举报

HAL(硬件抽象层)是建立在Linux驱动之上的一套主程序,这套主程序并不属于Linux内核,而是属于Linux内核层之上的应用层。在Android中加入HAL的原因是:Linux系统中Linux驱动有两种类型的代码,访问硬件寄存器的代码——调用的Linux内核的标准函数进行的标准操作;业务逻辑代码——有些企业或个人并不想将源代码公开。Google为了满足这些不想开源的Linux驱动作者的要求,在android层次结构中的系统运行库增加了一个HAL,但是HAL并不是Linux内核的一部分。主要目的:统一硬件的调用接口;解决了GPL版权问题;针对一些特殊的要求。

HAL架构基本原理就是在Android系统中使用程序库.so文件调用位于内核空间的一半通过设备文件访问的Linux驱动。然后Android应用程序apk文件可通过NDK程序访问HAL中的程序库,或直接在Android应用程序中访问HAL中的程序库,可直接使用Java代码访问。

编写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的函数,根据设备类型和功能的不同,编写相应的函数