Android深度探索-卷1第九章心得体会
在android系统中使用Linux 驱动有两种方式一种是通过传统的方式直接与Lmux 驱动交互,如,直接读写设备文件的数据。另外一种是Android特有的,就是通过HAL 模块。HAL 模块本质是通过Linux 共享库与Linux驱动交互,然后应用程序再访问Linux共享库。为每一个HAL共享库指定一个ID,再利用这个配合一定的规则找到linux共字库。
HAL (硬件抽象层)是建立在Linux 驱动之上的一套程序库属于Linux 内核层之上的应用层。
Android加入HAL层主要目的统一硬件的调用接口,解决GPL版权问题,针对一些特殊的要求。
编写一款支持HAL 的Linux 驱动程序的步骤:第1 步:编写Linux 驱动;第2 步:编写HAL Library;第3 步:编写Service Library
编写HAL 模块的步骤和原理如下。
第l. 步:定义结构体和宏编写HAL 模块需要使用到3 个非常重要的结构体 hw_module_t 、hw_device_t 和hw _ module_ methods_t, 需要定义两个新的结构体, 还需要为HAL模块定义一个ID
第2 步L 编写HAL 模块的open 函数, open 函数是HAL 模块的入口点。以led_device_open 函数为例,韧始化hw_device_t 的子结构体,打开设备文件,初始化寄存器.
第3 步:定义hw_module_methods_ t 结构体变量, HAL 模块需要hw_module_methods_t 纣构体的open 函数指针交量指定open 入口函数
第4 步:定义HAL_MODULE_INFO_SYM 变量,所有的HAL 模块都必须有一个HAL_MODULE_INFO_SYM 变量
第5 步:编写HAL 模块的close 函数,当HAL 模块被卸载后会调用close 函数。
第6 步:编写控制LED 的函数,根据设备类型和功能的不同,这一步编写的函数也有所不同
编写调用HAL 模缺的Serv i ce
调用HAL 模块涉及hw_get_ module 函数。该函数可以通过在leds_hal.h 中定义的LED_HARDWARE_MODULE_ID 宏查找LED HAL 模块,并获得led_modu le_t 结构体。然后调用led module_ t.hw _ module.methods.open 函数来初始化LED 驱动, 并通过open 函数返回led_control_device_t 结构体。led_control_ device_ t 结构体中包含了在HAL 模块中定义的控制LED驱动的函数指针set_on和set_off
HAL模块的存放路径和命名规则的结论
HAL 棋块库文件的存放路径有两个:/system/lib/hw 和/vendor/lib/hw.
HAL 模块库文件的命名规则是ID.suffix.so。
hw _get_module 会在Android 系统的属性文件中根据variant_keys 数组中定义的4 个key依次查找suffix
Android 系统的属性文件有4 个:
/default.prop ;
/system/build.prop;
/system/default.prop;
/data/local.prop .
Android 在启动时会自动装载这些属性文件
Android深度探索-卷1第九章心得体会的更多相关文章
- Android深度探索-卷1第二章心得体会
这章介绍了搭建Android开发环境的的搭建,主要是在Linux上搭建Android开发环境总体来说因为都是在Linux下开发的,so,只介绍了在Linux环境下的搭建在搭建过程中全是命令操作,和Wi ...
- Android深度探索-卷1第一章心得体会
本章介绍了安卓系统移植与驱动开发的概述,安卓的系统架构有四层:1 Linux内核,2 c/c++代码库, 3 Android SDK API, 4 应用程序 在读的过程中看到了专业名词,查了查,长点 ...
- Android深度探索-卷1第十章心得体会
本章介绍了传统的printk 函数调试技术和其他的调试技术,如gdb gdbserver kgdb 对于复杂的Linux 驱动及HAL 等程序库,需要使用各种方法对其进行调试,如,设置断点.逐步跟踪 ...
- Android深度探索-卷1第八章心得体会
本章介绍了如何将Linux驱动分成多个实现文件和Linux常用的代码重用方式还有些强行卸载Linux驱动的方法 开发一个Linux驱动,可能会在init.exit等函数中发生错误导致Linux驱动安装 ...
- Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装
前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...
- Android深度探索-卷1第四章心得体会
这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...
- Android深度探索-卷1第五章心得体会
S3C6410是由三星公司推出的一款低功耗.高性价比的RISC处理器,开发是,首先安装minicom串口调试工具: 第一步:检测当前系统是否支持USB转串口. Lsmod | grep usseria ...
- Android深度探索-卷1第六章心得体会
这章主要介绍了第一个linux驱动程序:统计单词个数.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.大多数Linux驱动都有与其对应的设备文件,因 ...
- Android深度探索-卷1第三章心得体会
第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...
随机推荐
- SQLServer中ISNULL和CONVERT函数
create view sss as(select ISNULL(operate_time, CONVERT(VARCHAR(20),create_time,120)) time from s_pro ...
- 【记录】form-data与x-www-form-urlencoded的区别
1)application/x-www-form-urlencoded 这应该是最常见的 POST 提交数据的方式了.浏览器的原生 <form> 表单,如果不设置 enctype 属性,那 ...
- KNN算法项目实战——改进约会网站的配对效果
KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...
- paste 合并文件
1.命令功能 paste 用于合并文件的列,把每个文件以列对列的方式,一列列地加以合并. 2.语法格式 paste option file 参数选项 参数 参数说明 -d 指定间隔符合并文件(默 ...
- Tunnel connection failed: 407 Proxy Authentication Required
报错信息 : Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connecti ...
- mona!mona!mona!
$ PS: $ 关于\(mona\) 是只很棒的猫啦!想知道的可以自己去看\(persona5\)的游戏流程或者动画版啦. \(PPS:\) 补充一下设定啊,\(mona\)是摩尔加纳(原名)的代号啦 ...
- thinkphp不读取.env文件的键对值
第一:$_ENV会为空,其原因通常是php的配置文件php.ini的配置项为: :variables_order :Default Value: “EGPCS” :Development Value: ...
- Java集合(容器)学习
1.集合和数组有什么区别,为什么使用集合而不用数组? 相同点:集合和数组都可以存储多个对象,对外作为一个整体存在. 数组的缺点: 长度必须在初始化时指定,且固定不变: 数组采用连续存储空间,删除和添加 ...
- maven 自动编译脚本
在maven工程根目录创建windows批处理脚本文件,例如tool.bat,内容如下 @echo off color 1f :menu echo -------------------------- ...
- centos 6.5 安装 jdk 8
首先,检查是否已安装jdk,如果有,要先删除 rpm -qa|grep java rpm -e --nodeps filename 然后,从oracle官方网站下载jdk安装包:jdk-8u121-l ...