HAL(硬件抽象层)是建立在linux驱动之上的一套程序库。这套程序库不属于linux内核,而是Linux内核之上的应用层。
加入HAL的主要目的:
1、统一硬件的调用接口。由于HAL标准的调用接口,所以可以利用HAL屏蔽linux驱动复杂、不统一的接口。
2、解决了GPL版权问题。由于linux内核基于GPL协议,而Android基于Apache Licence2.0协议。因此,将原本位于linux驱动中的敏感代码向上移了一个层次。这样这些敏感代码就包脱了GPL协议的束缚,那些不想开源的linux驱动作者就没必要开源了。
3、针对一些特殊的要求。对于有些硬件,可能需要访问一些用户空间的资源,或在内核控件不方便完成的工作以及特殊的需求。在这种情况下,可以利用位于用户空间的HAL代码来辅助linux驱动完成一些工作。
为LED驱动增加HAL
编写支持HAL的linux驱动程序的步骤:
1、编写linux驱动:linux的驱动代码要尽量简洁,尽可能将业务逻辑放到HAL Library中。
2、编写HAL Library:HAL Library就是普通的Linux library(*.so)文件。但这类库文件中有一个接口。通过HAL_MODULE_INFO_SYM变量实现。Service library就是通过这个接口中定义的ID定位HAL Library。
3、编写Service Library
编写HAL的步骤:
1、定义结构体和宏
2、编写HAL模块的open函数
3、定义hw_module_methods_t结构体变量
4、定义HAL_MODULE_INFO_SYM变量
5、编写HAL模块的close函数
6、编写控制LED的函数