在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. centos解决Could not find a version that satisfies the requirement pip3 (from versions: none)及No matching distribution found for pip3问题

    python环境:python 3.8 报错信息: WARNING: pip is configured with locations that require TLS/SSL, however th ...

  2. ReactiveCocoa详解

    最近看了大神的博客后,感觉该对ReactiveCocoa做一个了断了. 首先大致的对以下关于ReactiveCocoa内容做一个简单的总结,其他的后续更新 1.ReactiveCocoa的操作思想 2 ...

  3. ASE Beta Sprint - backend scrum 4

    本次scrum于2019.12.10在sky garden进行,持续10分钟. 参与人: Xin Kang, Zhikai Chen, Lihao Ran, Hao Wang 请假: Ning Jia ...

  4. 模块学习笔记-IR2110/IR2130(上)

    引言 IR2110 / IR2113是高压,高速功率MOSFET和IGBT驱动器,具有独立的高端和低端参考输出通道.逻辑输入与标准CMOS或LSTTL输出兼容,低至3.3V逻辑.浮动通道可用于驱动高端 ...

  5. Python中queue消息队列模块

    from queue import Queue from queue import PriorityQueue print("Queue类实现了一个基本的先进先出(FIFO)容器,使用put ...

  6. ZYNQ系列

    赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平.   中文名 ZYNQ系列 开发商 赛灵 ...

  7. 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡

    基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述  本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...

  8. 【LeetCode】二分 binary_search(共58题)

    [4]Median of Two Sorted Arrays [29]Divide Two Integers [33]Search in Rotated Sorted Array [34]Find F ...

  9. NotSerializableException

    这个错误是实体类没有  继承  Serializeble.

  10. 一种算法的实现,几个相同大小的div组合在一起,判断是不是矩形