在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第九章心得体会的更多相关文章

  1. Android深度探索-卷1第二章心得体会

    这章介绍了搭建Android开发环境的的搭建,主要是在Linux上搭建Android开发环境总体来说因为都是在Linux下开发的,so,只介绍了在Linux环境下的搭建在搭建过程中全是命令操作,和Wi ...

  2. Android深度探索-卷1第一章心得体会

     本章介绍了安卓系统移植与驱动开发的概述,安卓的系统架构有四层:1 Linux内核,2 c/c++代码库, 3 Android SDK API, 4 应用程序 在读的过程中看到了专业名词,查了查,长点 ...

  3. Android深度探索-卷1第十章心得体会

    本章介绍了传统的printk 函数调试技术和其他的调试技术,如gdb gdbserver  kgdb 对于复杂的Linux 驱动及HAL 等程序库,需要使用各种方法对其进行调试,如,设置断点.逐步跟踪 ...

  4. Android深度探索-卷1第八章心得体会

    本章介绍了如何将Linux驱动分成多个实现文件和Linux常用的代码重用方式还有些强行卸载Linux驱动的方法 开发一个Linux驱动,可能会在init.exit等函数中发生错误导致Linux驱动安装 ...

  5. Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装

    前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...

  6. Android深度探索-卷1第四章心得体会

    这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...

  7. Android深度探索-卷1第五章心得体会

    S3C6410是由三星公司推出的一款低功耗.高性价比的RISC处理器,开发是,首先安装minicom串口调试工具: 第一步:检测当前系统是否支持USB转串口. Lsmod | grep usseria ...

  8. Android深度探索-卷1第六章心得体会

    这章主要介绍了第一个linux驱动程序:统计单词个数.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.大多数Linux驱动都有与其对应的设备文件,因 ...

  9. Android深度探索-卷1第三章心得体会

    第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...

随机推荐

  1. 什么是python??

    python 是一门非常简单易学好用,同时功能强大的编程语言,具有丰富和强大的库,开发效率特别高.它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起. pyth ...

  2. 题解 P5265 【模板】多项式反三角函数

    →_→ OI 生涯晚期才开始刷板子题的咱 其实这题就是道公式题,搞过多项式全家桶的同学贴贴板子照着公式码两下都能过... 至于公式的证明嘛...总之贴上公式: \[Arcsin(F)=\int{F'\ ...

  3. SQL 中的正则函数

    ORACLE中支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似,比LIKE强大得多. 2,REGEXP_INSTR :与INSTR的功能相似. 3,REGEXP ...

  4. 搜索(DFS)---好友关系的连通分量数目

    好友关系的连通分量数目 547. Friend Circles (Medium) Input: [[1,1,0], [1,1,0], [0,0,1]] Output: 2 Explanation:Th ...

  5. fanc委托在项目中使用

    一,上代码 using System; namespace FuncDemo { class Program { static void Main(string[] args) { //无参数的fan ...

  6. 如何在虚拟机VM安装windows 2008R2

    1.首先确保已经安装好VM软件后进行以下操作.首先点击"文件"->再点击新建虚拟机.如图 2.点击新建虚拟机后会弹出如图所示,可以点击"典型",这里建议选 ...

  7. git submodule删除多余模块

    rm -rf 子模块目录 删除子模块目录及源码 vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目 vi .git/config 删除配置项中子模块相关条目 rm ...

  8. Python之文件的读

    python中文件的读操作:以只读的形式打开文件->逐行读取文件中的内容->关闭文件 代码如下 #文件的读 f = file(u'F:\\python\\homework.txt', 'r ...

  9. ll字段 详解 文件权限

    文件类型和权限 硬链接总数 属主用户名 属组组名 文件大小(字节) 上次修改时间 文件/目录名 drwxr-xr-x 15 lb lb 4096 10月 19 01:11 ./ drwxr-xr-x ...

  10. Java中数组在内存中的存放原理?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyong0717/article/details/79165685Java中数组被实现为对象, ...