9

第九章讲了硬件的抽象层HALHAL是建立在linux驱动上的一套程序库,不属于linux内核,属于linux内核层之上的应用层,对传统的linux系统中linux驱动一般有两类型的代码,访问硬件寄存器的代码和业务逻辑代码,因为都是调用linux内核的标准函数进行的便准操作,google为了满足不想开源的linux驱动者的需求,在android层次中的系统运行层增加了一个HALHAL并不是linux内核的一部分,而是位于android的系统运行库层,HAL主要有以下目的:

1统一硬件调用接口,可以利用HAL屏蔽linux驱动复杂、不统一的接口

2解决了GPL版权问题

3针对特殊要求,对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作及特殊要求,可以利用位于用户空间的HAL代码辅助linux驱动完成一些工作。

加入了HALled驱动不需要再关心linux驱动和设备文件的交互方式,只需要像访问普通API一样就可以和linux驱动进行交互。首先编写一款支持HALlinux驱动要比平常的复杂一些,但是易维护,完成之后,去掉led驱动中所有与读写寄存器规则相关的代码,只保留创建设备文件以及与寄存器交互的代码,只从制定寄存器读取或写入5个字节,就可以完成实现新的linux驱动。

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

1定义结构体和宏

  hw_module.t   hw_device.t    hw_module_methods.t

2编写HAL模块的open函数

  初始化hw_device.t的子结构体

  打开设备文件

  初始化寄存器

3定义hw_module_methods.t结构体变量

4定义HAL_MODULE_INFO_SYM变量

5编写HAL模块的close函数

6编写控制led的函数

HAL模块的存放路径通常放在/system/lib/hw目录,文件名中一般有一个default

HAL模块本质上就是通过liunx共享库与linux驱动交互,然后应用程序再访问linux共享库。

posted @ 2016-07-04 12:50  曹亮是我  阅读(126)  评论(0编辑  收藏  举报