HAL硬件抽象层(理解)

来源:互联网 发布:think.js 编辑:程序博客网 时间:2024/05/21 11:32

      安卓开发中的抽象层位于linux kernel之上,JNI之下,简单就是实现的就是对底层linux kernel上设备驱动的封装,使安卓系统不开源。

主要原理:安卓HAL层,简单的说是对Linux kernel的简单封装,向上提供接口,屏蔽底层的实现细节。把对硬件的支持分成两层:用户空间,内核空间。如果把对硬件支持的所有代码都放在内核层,就是开源,别人就能看到你的硬件的相关参数和实现,所以安卓把硬件的支持分成HAL和内核驱动层,内核驱动层只提供简单的访问硬件逻辑。例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放到HAL层中了。

也正是因为这种原因,HAL层屏蔽了不用硬件平台的差异,给应用程序开发提供了一个统一接口

HAL层中有三个重要的结构体,它们分别是:hw_module_t、hw_device_t和hw_ module_methods_t。

顾名思义hw就是hardware,hw_module_t呢就是就是硬件模块结构体。hw_device_t呢就是硬件设备结构体,hw_module_methods_t就是硬件模块方法结构体。

      在源码的/hardware/libhardware/include/hardware下有hardware.h文件。里面详细介绍了这三个结构体的成员。在这里简单的说一下,只是简单理解。

      在hw_device_t结构体中有一个成员变量是

          /** reference to the module this device belongs to */
               struct hw_module_t* module;   //可以理解为这个设备的模块结构体

     还有一个变量是 

       /** Close this device */
           int (*close)(struct hw_device_t* device); //这是一个函数指针,意思是这里有个关闭这个设备的函数(关于函数指针详解请看。。。)。

hw_device_t结构体中就先看这么多。因为设备结构体里有了一个设备的模块结构体,所以我们来看一下模块结构体 hw_module_t。

     在hw_module_t结构体中呢有一个重要的成员是

  /** Modules methods */
    struct hw_module_methods_t* methods;
 //可以看出这是一个成员方法。

其他的成员先不分析,接着看hw_module_methods_t结构体

typedef struct hw_module_methods_t {
    /** Open a specific device */
    int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);
} hw_module_methods_t;

hw_module_methods_t结构体中呢只有一个函数指针,意思是打开一个特定的设备。所以这就是一个打开设备的方法。相对的hw_device_t里面有一个关闭设备的方法,这就对应上了。

      硬件抽象层,顾名思义,就是抽象硬件,主要就是硬件,也就是一个设备。设备呢,有了一个设备结构体(hw_device_t),这个设备结构体有模块,所以就引出了设备模块结构体(hw_module_t),设备模块结构体里有一个模块方法结构体(hw_module_methods_t),方法结构体有一个打开函数,设备结构体里有关闭函数,所以就有的打开和关闭这个设备的函数,其他的像读啊写啊ioctl函数等可以实现在设备结构体里,因为本来就是设备的操作方法嘛。

      大致了解了这三个结构体和有关思路后,接下来我们就看看怎么使用它们。

(接触安卓底层时间不长,如果有不对的地方请立即指正!感激不尽!)

0 0
原创粉丝点击