zoukankan      html  css  js  c++  java
  • 第九章

    第9章  硬件抽象层:HAL

    HAL是建立在Linux驱动上的一套程序库,这套程序库不属于linux内核,而是属于linux内核层之上的应用层,GoogleAndroid增加HAL是为了尽量避免应用程序直接访问Linux驱动外,还保护“私人财产”。

    加入HAL的原因:

    1统一硬件的调用接口,由于HAL有标准的调用接口,所以可以利用HAL屏蔽linux驱动复杂,不统一的接的接口。

    2解决了GPL版权问题,由于linux内核基于GPL协议,而Android基于Apache licence 2.0协议,这些敏感代码就摆脱了GPL 协议的束缚, 。那些不想开源的Linux驱动作者也就没必要开源了。

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

    驱动完成一些工作。

    Android HAL驱动构架

    Android_.H现二的源代码存储的位置并不固定, →般会存储奋,<Android源代码目录>/hardware !§.

    果中。其中<An~roid 源代码目录>/hai-dwiire/1bardware )egcy 目录用来存储旧liAL 架构的源代码γ

    文件。新HAL 架构’的源优码在<Android 源代码目录>lhardwareli ibhardware_目录中,当然,这些源

    , 代码文件也可以放在<Androi.d 糠代码目录>/hardware 或其他的国录。最终编译生成的.so 文件主要

    放在Android 系统的/s~stem/fib/bw 目录(也可以放在其他的目录,详细内容将在后面的部分介绍〉。

    LED驱动增加HAL

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

    1 g 编写Linux 驱动

    “编写Linux 驱动”,从表明上看是废话,但如果要为Linux 驱动添加HAL,而且想尽量保护敏

    感数据。Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到HAL Library 中。

    2 步:编写HAL Library

    HAL Library 就是普通的Linux Library .so )文件。但这类库文件有一个接口。通过

    HAL MODULE_INFO SYM 变量实现。Service Library 就是通过在这个接口中定义的ID 定位HAL

    Library 的。

    3 步:编写Service Library

    尽管这步并不是必需的,但新的HAL 架构要求我们这样做。Service Library 也是Linux Library

    这一步比较灵活。Service Library 可以是一般的Linux Library,也可以是别I Library。在本章的LED

    驱动例子中将Service Libratγ 和刑I Library 合到了一起。也就是说, Service Library 就是JNI Library.

    实际上这一步除了用CIC件实现的* .so 库文件外,还应该包含一个用Java 编写的服务管理类

    ( ServiceManager )。ServiceManager 会调用Service Library。而APK 程序会调用ServiceManager 类米

    访问Service Library。、

    编写程序后执行以下命令

    # sh build. Sh

    # build.sh

    surce ./build s3c6410 .sh

    测试读写寄存器操作

    rwdev <r lw> <dev_file> <byte_count> [bytel] [byte2J ... [byten)

    dev:命令行程序。

    rlw>:读或写命令。r 表示读取寄存器中的数据「W 表示向寄存器写入数据。

    <dev fl.le> :· 设备文件名,

    <b¥te_count> : 写入或读取的字节数。

    [bytel ]、[byte2] .. . [byten]: 写入的字节。如果读取字节, rwdev 会输出该字节的十进制数。

    编写调用LED驱动的HAL模块

    编写HAL 模块的步骤

    l步:定义结构体和宏

    2:编写HAL 模块的open 函数

    3步:定义hw_module_methods_ t 结构体变量

    4步: 定义HAL_MODULE_INFO_SYM 变量

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

    6z 编写控制LED 的函数

    编写调用HAL 模缺的Serv i ce

    编写调用Service Java

    运衍Android

    应用程序之前需要在开发板上安装如下3 个程序库。

    LED 驱动: /data/locaνs3c6410 leds hal.ko

    HAL 模块:/system/lib/hw/led_hal.default.so

    Service 程序库: /system/lib/led_haljni.so .

    android.系统中使用Linux 驱动有两种方式。一种是通过传统的方式直接与Lmux 驱动交交互。另外一种是Android特有的,就是通过HAL 模块,HAL 模块本质上就是通过Linux 共享库与linux驱动交互,然后应用程序再访问linux共享库。:早期的HAL模块白应用程序直接按访问Linux共字库的方式调用。而高版本的Android 系统为HAL增加了Stub ,就是为每一个HAL共享库指定一个ID,再利用这个ID 配合一定的规则找到linux共享库。

    http://i.cnblogs.com/EditPosts.aspx?opt=1

  • 相关阅读:
    如何使用ERStudio 生成comment
    windows 使用excel导出的问题
    iOS Runtime(一)、objc_class深深的误解
    iOS开发安全
    iOS微信运动 刷分
    APP中的 H5和原生页面如何分辨、何时使用
    Weex系列二、显示图片
    Android系列一、创建项目
    Weex系列一、构建Weex工程
    时间复杂度
  • 原文地址:https://www.cnblogs.com/Wqian/p/5643518.html
Copyright © 2011-2022 走看看