zoukankan      html  css  js  c++  java
  • 第九章 硬件抽象层:HAL

    一、Android增加HAL的主要目的除了尽量避免应用程序直接访问linux驱动之外,还有一个重要原因就是保护企业或个人的核心业务逻辑。在传统的linux系统中linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码,对于访问硬件寄存器的代码,都是调用linux内核的标准函数进行操作并没有什么秘密可言。而对于业务逻辑代码,它里面存在一些商业秘密或技术专利企业和个人并不想公开,所以在Android层次结构的系统运行库层增加了HAL,因此HAL就不属于linux内核的一部分而是在Android系统运行库层,自然就不必开源了。而linux驱动也就相当于一个“数据二传”了,唯一的功能就是接受来自HAL传过来的数据,并将数据写入指定寄存器中;或从寄存器读取数据,返回给HAL。HAL的主要目的如下:

    1.统一硬件的调用接口

    2.解决了GPL版权问题

    3.真对一些特殊的要求

    二、HAL架构

    相比于旧的HAL架构,新的HAL架构加入了一些架构要求的入口代码,并多了一层service程序库(就在此层通过ID定位了HAL Library)。

    注:虽然使用了新的HAL架构,但为了兼容性旧的HAL架构仍然支持。

    三、编写支持HAL的linux驱动程序的步骤

    1.编写linux驱动(linux驱动代码要尽量简洁,尽可能将业务逻辑代码放到HAL Library中)

    2.编写HAL Library(类库文件有一个接口,通过HAL_MODULE_INFO_SYM 变量实现。Service Library 就是通过在这个接口中定义的 ID 定位 HAL Library)

     编写HAL模块的步骤及原理:

    (1)第 1步:定义结构体和宏,编写 HAL 模块需要使用到 3 个非常重 要的结构体 ( hw_module_t 、 hw_device_t和hw_ module_ method_t)

    (2)第2步:编写HAL模块的open函数

    (3)第3步:定义hw_ module_ method_t结构体变量

    (4)第4步:定义HAL_MODULE_INFO_SYM结构体变量

    (5)第5步:编写HAL模块的close函数

    (6)第6步:编写控制LED的函数

    3.编写Service Library

  • 相关阅读:
    Gitbook
    Docker命令
    sd
    文本三剑客
    2017.4.12下午
    2017.4.11下午
    2017.4.11上午
    2017.4.10下午
    2017.4.10上午
    2017.4.7下午
  • 原文地址:https://www.cnblogs.com/wyx13/p/5625790.html
Copyright © 2011-2022 走看看