第九章 硬件抽象层:HAL
第九章 硬件抽象层:HAL
本章介绍的是HAL硬件抽象层,他是属于linux内核层之上的应用层,解释了在Android中加入HAL的原因是Google为了满足不想开源的Linux驱动作者的要求,在Android层次结构中的系统运行库层增加了一个HAL,来统一硬件的调用接口,解决GPL版权问题以及一些特殊要求。接下来再以前第七章中的LED程序中加入HAL,应用程序不需要再关心Linux驱动和设备文件的交互方式,只需要像访问普通API一样可以和Linux启动进行交互。
1.编写支持HAL的linux驱动程序步骤
(1)编写linux驱动
(2)编写HAL Library
普通的(*.so)文件,但是像这类库文件有一个接口。通过HAL_MODULE_INFO_SYM变量实现。
(3)编写Service Library
2.精简LED驱动
去掉了所有与读写寄存器规则相关的代码,只保留了创建设备文件及寄存器交互的代码,在设备文件的read和write函数中读写指定的寄存器。在与LED交互时,只要向设备文件读取或者发送五个字节的数据就可以读写指定的寄存器。LED驱动程序的设备文件接收的不是字符串。而是字节类型的数据,需要一个单独程序像设备文件写入字节形式的数据,或者从设备文件中读取字节类型的数据。
3.所有的HAL模块都必须要有一个HAL_MODULE_INFO_SYM变量。HAL模块由leds_hal.c和leds_hal.h组成。leds_hal.h头文件用于定义结构体、宏和引用一些系统的头文件。
4.编写HAL模块的步骤和原理
(1)定义结构体和宏
三个重要的结构体(hw_module_t描述HAL模块、hw_device_t描述HAL设备的结构体和hw_module_methods_t描述模块入口函数)。
(2)编写HAL模块的open函数
open函数是HAL模块的入口点,函数的主要功能是3项,初始化hw_device_t的子结构体;打开设备文件、初始化寄存器。
(3)定义hw_module_methods_t结构体变量
此结构体的open函数指针变量指定open入口函数
(4)定义HAL_MODLE_INFO_SYM变量
所有的HAL模块都必须有这个变量,代码回初始化一些此结构体及其结构体的成员变量,id和methods最重要。
(5)编写HAL模块的close函数
当HAL模块被卸载后会调用close函数,
(6)编写控制LED的函数
控制函数是led_on和led_off,用来控制LED的开关。
5.编写调用HAL模块的Service
http://www.cnblogs.com/xxyue/