zoukankan      html  css  js  c++  java
  • 9

    第九章讲了硬件的抽象层HALHAL是建立在linux驱动上的一套程序库,不属于linux内核,属于linux内核层之上的应用层,对传统的linux系统中linux驱动一般有两类型的代码,访问硬件寄存器的代码和业务逻辑代码,因为都是调用linux内核的标准函数进行的便准操作,google为了满足不想开源的linux驱动者的需求,在android层次中的系统运行层增加了一个HALHAL并不是linux内核的一部分,而是位于android的系统运行库层,HAL主要有以下目的:

    1统一硬件调用接口,可以利用HAL屏蔽linux驱动复杂、不统一的接口

    2解决了GPL版权问题

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

    加入了HALled驱动不需要再关心linux驱动和设备文件的交互方式,只需要像访问普通API一样就可以和linux驱动进行交互。首先编写一款支持HALlinux驱动要比平常的复杂一些,但是易维护,完成之后,去掉led驱动中所有与读写寄存器规则相关的代码,只保留创建设备文件以及与寄存器交互的代码,只从制定寄存器读取或写入5个字节,就可以完成实现新的linux驱动。

    编写HAL模块的步骤和原理如下:

    1定义结构体和宏

      hw_module.t   hw_device.t    hw_module_methods.t

    2编写HAL模块的open函数

      初始化hw_device.t的子结构体

      打开设备文件

      初始化寄存器

    3定义hw_module_methods.t结构体变量

    4定义HAL_MODULE_INFO_SYM变量

    5编写HAL模块的close函数

    6编写控制led的函数

    HAL模块的存放路径通常放在/system/lib/hw目录,文件名中一般有一个default

    HAL模块本质上就是通过liunx共享库与linux驱动交互,然后应用程序再访问linux共享库。

  • 相关阅读:
    论线段树:二
    BST 二叉搜索树
    论线段树:一
    [luoguP3627][APIO2009]抢掠计划
    二分图匹配(匈牙利算法)
    SPFA 全面讲解
    markdown的常用高级操作。
    UVA11235 Frequent values
    P2279 [HNOI2003]消防局的设立
    P2216 [HAOI2007]理想的正方形
  • 原文地址:https://www.cnblogs.com/liang0202/p/5640111.html
Copyright © 2011-2022 走看看