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后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...
随机推荐
- dfs(首尾字母)
http://acm.hdu.edu.cn/showproblem.php?pid=1181 变形课 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Codeforces 191C (LCA+树上差分算法)
题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...
- P1973 [NOI2011]Noi嘉年华
传送门 首先可以把时间区间离散化 然后求出 $cnt[l][r]$ 表示完全在时间 $[l,r]$ 之内的活动数量 设 $f[i][j]$ 表示当前考虑到时间 $i$,第一个会场活动数量为 $j$ 时 ...
- C#设计模式:职责链模式(Chain of Responsibility)
一,什么是职责链模式(Chain of Responsibility) 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着 ...
- 银联银行卡查询服务-dubbo实现
最近看到银联开放了一个银行卡查询的服务,具体内容见官网https://open.unionpay.com/tjweb/api/detail?apiSvcId=51 尝尝鲜 在文档下载目录下,下载upa ...
- JS删除对象中的某一属性(delete)
var obj= {} 1.JS对象添加新属性 obj.address="shenzhen" 2.JS删除对象中的某一属性(delete) var obj= { height: , ...
- 设置div 居中 和得到dom元素高度
javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...
- FreeRTOS之taskYIELD()
摘自:http://www.mcuchina.com/article/2007/1227/article_59.html 1.taskYIELD() 比如我创建了8个优先级一样的task,并且没有 ...
- Redirecting to /bin/systemctl restart mysql. service Failed to restart mysql.service: Unit not found.
使用如下命令操作mysql即可: systemctl restart mysqld.service systemctl start mysqld.service systemctl stop mysq ...
- python之requests模块中的params和data的区别
params的时候之间接把参数加到url后面,只在get请求时使用: import requests url='https://api.ireaderm.net/account/charge/info ...