安卓深度探索(卷一)第九章

HAL ( Hardware Abstraction Layer ,硬件抽象层,是建立在 Linux 驱动之上的一套程序库,传统的 linux系统中 Linux 驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码HAL 并不是 Linux 内核的 部分,而是位于Android的系统运行库。也就是说在 Linux驱动中不应该保留任何不想公开的业务逻辑代码 这些代码都放在 HAI 层中,而只保留与寄存器交互的代码,访问寄存器只有 Linux 内核的相关函数能做到。如果这样安排 Linpx 驱动就只剩下一个空壳了,唯 一的功能就是接收由 HA L传过来的数据,并将这些数据 写入指定的寄存器中,或从寄存器读取数据,并返回给 HA L。总而言之Google为Android加入HAL主要有如下目的:

硬件的调用接口。由 HAL 有标准的调用接口,所以可以利用 HA L屏蔽 Linux 驱动

复杂,不统一的调用接口。

解决了 GPL 版权问题。由于Linux 内核基于GPL协议,而 Android 基于 Apache Licence 2 .0协议.因 此Google 玩了个“穿越“将原本位于 Linux 驱动中的敏感代码向上移了一个层次,这样这些敏感代码就摆脱 GPL 协议的束缚, 那些不想开源的 Linux 驱动作者也就没必要开源了。

针对一些特殊的要求 对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间 HAL 代码来辅助 Linux驱动完成 些工作。

编写一款支持 HAL Linux 驱动程序的步骤

  1. 编写linux驱动
  2. 编写HAL library
  3. 编写Service Library

实现的LED 驱动包含了 Linux 驱动 ,HAL 摸块、 Service 程序库、 NDK 程序和 Java 程序,所有的 HAL 程序都必须要有 HAL_MODULE_ INFO_SYM 变量

编写HAL模块步骤

  1. 定义结构体和宏
  2. 编写HAL模块的open函数
  3. 定义hw_module_methods_t结构体变量
  4. 定义HAL_MODULE_INFO_SYM变量
  5. 编写HAL模块的close函数
  6. 编写控制LED的函数
时间: 2024-10-26 17:22:03

安卓深度探索(卷一)第九章的相关文章

Android深度探索笔记-第九章

HAL层属于Linux内核层之上的应用层是为了尽量避免应用程序直接访问Linux驱动和保护 “私人财产”.带HAL的 Linux 驱动就相当于将数据从HAL传到寄存器,或从寄存器传到HAL的数据二传. 加入HAL的主要目的:1:统一硬件的调用接口,2:解决了GPl版权问题,3:针对一些特殊的要求. Android HAL的源代码存储的位置并不固定,一般会存储在Android源代码目录/hardware目录中. 编写一款支持HA 的Linux驱动程序的步骤:1:编写 Linux 驱动:2:编写 H

《Android深度探索卷一》第一章Android系统移植与驱动开发概述。

<Android深度探索>第一章讲的是Android系统移植与驱动开发概述.这一章节将对Android以及Linux驱动做一个总体的介绍. Android是一个非常优秀的的嵌入式操作系统.经过几年的发展和演进,Android已经形成了非常完善的系统架构.Android的系统架构分为四层,如下图 Android移植可分为两部分:应用移植和系统移植. Android系统移植是指让Android操作系统在某一个特定硬件平台上运行.使一个操作系统在特定硬件平台上运行的一个首要条件就是该操作系统支持硬件

Android深度探索第四章总结

Android深度探索第四章主要是源代码的下载和编译.要下载Android源代码首先需要配置Android源代码下载环境(1.创建一个用于存放下载脚本文件的目录:2.下载repo脚本文件:3.创建用于存放Android晕代码的目录:4.初始化:5.开始下载Android源代码).介绍了Android源代码目录结构(/bootable这个目录下存放 android 部分启动相关代码,包括 android 的 recovery模式,一般用于进行 OTA 升级,由 C++ 编写,可以看到用于显示的ui

Android深度探索第三章总结

Android深度探索第三章主要是Git使用入门.这一章首先让我们先安装Git,在进行编程是可以查看Git文档man git—checkout安装git—doc后会安装git文本格式和HTML格式的文本.查看文本用git help <sub—command>.使用命令"git init"初始化的版本库(暂且称为working repository)将会生成两类文件:第一类是版本库目录.git目录,它里面存放的是版本的历史记录信息和实际项目文件的拷贝;你可以把这类版本库叫做&

《Android深度探索》第一章心得体会

<Android深度探索>第一章讲的是Android系统移植与驱动开发概述.Android的系统架构分为四层:Linux内核.C/C++代码库.Android SDK API.应用程序.Android移植的主要工作:移植Linux驱动和移植HAL.学习Linux驱动要准备一个自己熟悉的Linux操作系统,用于开发和测试Linux驱动:准备一块开发板:学习GNU C:学习相关的硬件知识:不断地实践.Linux将存储器和外设分为3大类:字符设备.块设备.网络设备. 通过对第一章的学习,我了解到由于

《Android深度探索》第二章心得体会

<Android深度探索>第二章讲的是搭建Android开发环境.搭建Android底层开发环境主要包括Android应用程序开发环境和Android NDK开发环境和交叉编译环境的搭建.搭建Android开发环境的步骤:安装JDK:安装Android SDK:安装Eclipse:安装ADT:配置ADT:建立AVD:下载Android NDK:安装CDT:命令行方式编译Android NDK程序:导入Android NDK的例子:配置Android NDK 的集成开发环境:安装交叉编译环境.

安卓深度探索(卷一)第五章

S3C6410 是由三星公司推出的 款低功耗.高性价比的 SC ( reduced instruction set computer, 精简指令集计算机〉处理器,它基于 ARM11 内核. OK6410 开发板采用“核心板+底板”结构 安装串口调试工具:minicom 第一步:检测当前系统是否支持 SB 转串口 lsmod | grep usbserial 第二步:安装minicom sudo apt-get install minicom 第三步:配置minicom sudo minicom

安卓深度探索(卷一)第七章

led驱动的实现原理尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据 而是与本机的 ν0 内存( νO Memory ,位于内核空间〉进行交互.所谓 1/0 内存是通过各种接口( PC I .USB .蓝牙.以太网口 等〉连接到主机( PC .手机〉的硬件〈网卡.声卡.摄像头等〉在主机内存中的映射. 编写LED驱动 第一步:使用 cdev_init 函数初始化cdev 第二步:指定设备号 直接在代码中指定(硬编码〉 动态分配 第三步:使用 cdev_ad

安卓深度探索(卷一)第六章

Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交换数据.例如,向Linux打印机驱动发送一个打印命令,可以直接使用C语言函数open打开设备文件, 使肝 函数 oc tl 向该驱 的设备文件发送打印命令. 编写linux驱动的步骤 第一步:建 Linu 驱动骨架 装载和卸载