第九章 硬件抽象层:HAL 心得笔记
1.HAL(Handerware Abstraction Layer,硬件抽象层)是建立在linux程序上的一套程序库,这套程序库并不属于内核,而是属于内核之上的应用层。
2.要在Android中加入HAL的原因:在linux驱动中一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。对于访问硬件寄存器的代码而言,并没有秘密,这都是调用linux内核的标准函数进行的标准操作。
3.Google为android加入HAL其主要目的在于:
统一硬件的调用接口;
解决了GPL版权问题;
针对一些特殊要求。
4.andriod HAL架构
在Andriod系统中使用程序库,条用位于内核空间的Linux驱动,然后Andriod应用程序。
HAL的基本原理是在android系统中使用程序库调用内核空间的linux驱动。
5. 为LED增加HAL:将所有业务逻辑从LED驱动移植到HAL模块,而LED驱动模块只保留读写寄存器的工程能。加入HAL会使组成linux驱动的一整套library更加独立,更加容易维护。
6.编写一款支持HAL的LINUX程序驱动程序的步骤:
1>Linux驱动程序;
2>编写HAL Library;
3>编写Service Library。
7.编写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的函数
根据设备类型和功能的不同,编写相应的函数