通过第九章的学习,我学到了如下知识点:
第九章:硬件抽象层:HAL
9.1为什么要在Android中加入HAL
1.HAL并不是Linux内核的一部分,而是位于Android的系统运行库层
2.为Android加入HAL主要目的:统一硬件的调用借口,解决了GPL的版权问题,针对一些特殊的要求。
9.2Android HAL架构
9.3为LED驱动增加HAL
1.编写一款支持HAL的Linux驱动程序的步骤
第一步:编写Linux驱动
Linux驱动代码要尽量的简洁,尽可能将业务逻辑放到HAL Library
第二步:编写 HAL Library
HAL library就是普通的Linux library文件,但这类库文件有一个接口,通过HAL_MODULE_INFO_SYM变量实现,service library就是通过在这个接口中定义的ID定位HAL library的。
第三步:Service Library
这一步不是必须用到的。
2.颠覆Linux驱动的设计理念:精简LED驱动
编写LED驱动时需要注意:不和之前的LED冲突,需要修改部分代码避免冲突
3.测试读写寄存器操作
命令行语法格式:rwdev:命令行程序
<r|w>:读或写命令,r代表读取寄存器中的数据,w表示向寄存器写入数据。
<dev_file>:设备文件名
<byte_count>:写入或读取的字节数
[byte1],[byte2]:写入的字节
4.编写调用LED驱动的HAL模块
在这个HAL模块中包含了LED驱动的所有业务逻辑
编写HAL模块的步骤和原理:
第一步:定义结构体和宏
编写HAL模块需要使用3个非常重要的结构体(hw_module_t,hw_device_t,hw_module_methods_t)
第二步:编写HAL模块的open函数
Open函数是HAL模块的入口点
第三步:定义hw_module_methods_t结构体变量
HAL模块需要hw_module_methods_t结构体的open函数指针变量指定open入口函数。
第四步:定义HAL_MODULE_INFO_SYM变量
所有的HAL模块都必须有它
第五步:编写HAL模块的close函数
当HAL模块被卸载后会调用close函数
第六步:编写控制LED的函数
设备类型和功能的不同,这一步编写的函数也有所不同
5.编写调用HAL模块的service
6.HAL模块的存放路径和命名规则
HAL模块通常存放在/system/lib/hw目录下,文件名一般都有一个default
7.编写调用service的iava库
8.测试LED驱动
测试程序通过直接向LED驱动设备文件发送字符串来控制LED