HAL框架

HAL层结构体

HAL只有三个struct结构:

hw_module_methods_t (1)

hw_module_t (2)

hw_device_t (3)

typedef struct hw_module_methods_t {//硬件模块方法列表的定义,这里只定义了一个open函数
    /**并不是真正的操作设备,只是初始化一个hw_device_t结构体,这个结构体中含有设备处理函数,所以
    是间接‘打开’设备*/
    int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);
} hw_module_methods_t;
typedef struct hw_module_t {
    /** tag must be initialized to HARDWARE_MODULE_TAG */
    uint32_t tag;
    /** major version number for the module */
    uint16_t version_major;
    /** minor version number of the module */
    uint16_t version_minor;
    /** Identifier of module */
    const char *id;
    /** Name of this module */
    const char *name;
    /** Author/owner/implementor of the module */
    const char *author;
    /** Modules methods */
    //模块方法列表,指向hw_module_methods_t*
    struct hw_module_methods_t* methods;
    /** module‘s dso */
    void* dso;
    /** padding to 128 bytes, reserved for future use */
    uint32_t reserved[32-7];
} hw_module_t;
typedef struct hw_device_t {
    /** tag must be initialized to HARDWARE_DEVICE_TAG */
    uint32_t tag;
    /** version number for hw_device_t */
    uint32_t version;
    /** reference to the module this device belongs to */
    struct hw_module_t* module;
    /** padding reserved for future use */
    uint32_t reserved[12];
    /** Close this device */
    int (*close)(struct hw_device_t* device);
} hw_device_t; 

HAL API

HAL框架提供了一个公用函数:

hw_get_module(const char *id,const struct hw_module_t** module);

功能:根据模块id(module_id)去朝找注册在当前系统中与id对应的硬件对象,然后载入(load)其相应的HAL层模块的.so

文件。载入以后从.so文件中查找”HMI”这个符号,如果在.so代码中有定义的函数名或者变量名为HMI,返回其地址(存在第二个参数当中)。

实例

结构体声明:

    struct led_module_t{
        struct hw_module_t common;
        int status;
    };
    struct led_device_t{
        struct hw_device_t common;
        int (*set_on)(struct led_device_t* dev);
        int (*set_off)(struct led_device_t* dev);
    };

实现:

static int led_device_close(struct hw_device_t *device){
    struct led_deivce_t ldev=(struct led_device_t *)device;
    if(ldev)
        free(ldev);
    return 0;
}

static int led_set_on(struct led_deivce_t *dev){
    //调用HAL_Drive
    return 0;
}

static int led_set_off(struct led_deivce_t *dev){
    ////调用HAL_Drive
    return 0;
}

static int led_open(const struct hw_module_t* module,const char *name,struct hw_device_t **device){
    struct led_deivce_t *dev;
    LOGD("led_dev_open");
    dev=(struct led_deivce_t*)malloc(sizeof(struct led_deivce_t));
    memset(dev,0,sizeof(struct led_deivce_t));

    dev->common.tag=HARDWARE_DEVICE_TAG;
    dev->common.version=0;
    dev->common.module=(struct hw_module_t*)module;
    dev->common.close=led_device_close;
    dev->set_on=led_set_on;
    dev->set_off=led_set_off;
    *device=(struct hw_device_t*)dev;
    return 0;
}
const struct led_module_t HAL_MODULE_INFO_SYM={{HARDWARE_DEVICE_TAG,1,0,LED_HARDWARE_MODULE_ID,"TestLEDSTub","Test Project Team",&my_methods},-1};
static struct hw_module_methods_t my_methods={led_open}

客户端调用流程

(1)hw_get_module(const char id,const struct hw_module_t* module) 获取到hw_module_t对象的指针。

(2)hw_module_t中保存了函数指针表,查找到hw_module_methods_t中的led_open函数。

(3)led_open会创建hw_device_t对象,最后调用hw_device_t对象的函数(led_set_on/led_set_off)操作设备。

led_set_on—->HAL_Driver(不开源)—->Linux_Driver(开源)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 04:33:27

HAL框架的相关文章

Android audio HAL详解(一)

http://blog.csdn.net/kunis/article/details/16918937 1,HAL定义 HAL(hardware abstraction layer)从字面意思理解,称为硬件抽象层.它是Android framework层运行的基石,android系统上层所需要的所有有关硬件的操作都需要调用HAL相关的API,如GPS,BT,输入设备,Graphocs,Camera,Audio等.每种硬件设备Android系统都规范了一些功能,各个设备的HAL就是实现这些功能(调

在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度.很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支持HAL规范,当RESTful API被调用后,服务端就会返回ContentType为application/hal+json的JSON内容,例如: { "_links": { "

Tom's Android Course

Android底层框架解析与        Java&C/C++软硬整合开发技术 主讲人:高焕堂 (台湾Android教父级专家) 课程简介: 在智能&大数据时代,系统开发不仅仅攸关软件设计与开发,还涉及深度软硬整合的智能硬件设计与开发.在当今产业的成功方程式:(((硬件+ 软件) + 内容) + 电信)潮流下,如何将硬件.软件.内容和通信等一群<不会飞>的组件,以一种神奇的创新架构(Architecture)来组织起来,创造神奇的整体,像飞机一样<能飞>起来. 在

Android软硬整合设计与框架揭秘: HAL&amp;Framework &amp;Native Service &amp;App&amp;HTML5架构设计与实战开发

掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime.Android Framework.Android Native Service.Android Binder.Android App.Android Testing.HTML5技术的源泉和精髓等核心技术,不仅仅是技术和代码本身,更重要的是背后的设计思想和商业哲学. 一.课程特色 l  贯通And

Android Framework应用框架层和HAL硬件抽象层以及Linux Kernel底层之间的关系

Android应用框架层和硬件抽象层以及底层之间的关系 1. JNI技术: (1).JNI技术简单的说就是在本地Java语言声明本地方法和加载动态链接库(.so文件) (2).动态链接库(.so文件)是由NDK编译C/C++文件而成的. 2. HAL层开发: (1).HAL是Hardware Abstraction Layer的简称.也称为硬件抽象层. (2).硬件访问服务是在Framework层实现的. (3).硬件访问服务是用Java语言实现的,硬件抽象层是用C++语言编写的.因此硬件访问服

Android软硬整合设计与框架揭秘: HAL&amp;Framework &amp;Native Service &amp;App&amp;Browser架构设计与实战开发

在软硬整合领域, Android以其对软件和硬件的高度开放性引领了当今的软硬整合潮流,全世界正在进行一场轰轰烈烈的Android运动,Android以不可思议的速度渗透越来越广的领域,Android智能手机.Android智能电视.Android微波炉.Android平板电脑.Android智能机器人.Android车载系统等越来越多的Android产品涌入人们的工作和生活中,自从Google的[email protected]战略发布以来,更是让世界对Android充满了怦然心动的期待,可以预

【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔(2019-07-21)

说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.本次工程延续以往的代码风格,从底层BSP驱动包到应用代码,变量命名,文件命名,程序框架,注释等都比较规范,大家阅读或者移植都会比较方便.      另外,阅读代码时,务必将编辑器的缩进参数和TAB设置为4来阅读本文件,否则显示不整齐. 3.本教程每周会继续更新1-2章,之后将开启配套的视频教程制作,加大对初学者的支持力度. 4.V5,V6,V7将通过这次升级,达到底层驱

《Android深度探索》(卷1)HAL与驱动开发 第九章心得体会

本章主要学习了硬件抽象层:HAL. Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节.也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间.为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间

[android底层] hal硬件抽象层编写

两个与hal有关的结构体 hw_module_t ,hw_device_t 一.jni和hal之间的关系 Tip:几种app,jni,hal,framework之间的关系框架     这篇文章用的框架是第二种框架的编写,他们的关系如下: 可以看出jni主要通过pModule和pdevice来获取hal中的变量来操作hal层 二.jni操作hal 获取hal层:1.jni获取hal层的module和device对象 操作hal层:2.jni操作hal层 jni操作hal完整代码参考[android