首页 > 其他分享 >HAL stub

HAL stub

时间:2024-04-04 22:55:28浏览次数:23  
标签:HAL lethe int hw module stub device hal

每种硬件都对应了一个HAL模块,实现HAL,需要满足HAL的相关规则,规则定义在源码hardward目录下,头文件hardward.h,C文件hardward.c。

1、重要结构体:

hardward.h中定义了三个重要的结构体:
struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;
a、结构体hw_module_t代表hal模块 ,hal模块需自定义一个结构体,并且该struct包含hw_module_t结构体,且模块的tag必须为HARDWARE_MODULE_TAG,表示hal模块的结构体。 b、结构体hw_module_methods_t代表模块的操作方法列表,它内部只有一个函数指针open,用来打开该模块下的设备 c、结构体hw_device_t代表该模块下的设备,hal模块需要自定义一个结构体,且必须包含 hw_device_t。 d、最后这个模块定义好之后还必须导出符号HAL_MODULE_INFO_SYM,指向这个模块,HAL_MODULE_INFO_SYM定义在hardware.h中值为“HMI”  

2、上层如何与hal进行通信:

通过HAL_MODULE_INFO_SYM,google hal与qcom hal部分进行绑定,上层也通过HAL_MODULE_INFO_SYM获取到hal层的相关接口,获取到hal模块使用hw_get_module函数。  

3、实现加减的简单hal实现

在hardware/libhardware/include/hardware目录下建立lethe.h: 在该头文件中我们自定义设备结构体,在该设备结构体中声明add和subtract函数。
#include <stdint.h>
#include <stdbool.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <cutils/native_handle.h>
#include <hardware/hardware.h>
#include <hardware/gralloc.h>

// hal模块名
#define LETHE_HARDWARE_MODULE_ID "lethe"

// hal版本号
#define LETHE_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(0, 1)

#define HARDWARE_LETHE "lethe"

// 自定义hal模块结构体
typedef struct lethe_module {
        struct hw_module_t common;      // 第一个变量必须为hw_module_t
} lethe_module_t;

// 自定义hal设备结构体
typedef struct lethe_device {
        struct hw_device_t common;

        // 加法函数
        int (*add)(const struct lethe_device *dev, int a, int b, int *total);

        // 减法函数
        int (*subtract)(const struct lethe_device *dev, int a, int b, int *total);

} lethe_device_t;

static inline int lethe_open_test(const struct hw_module_t *module,
                lethe_device_t **device) {
        return module->methods->open(module, HARDWARE_LETHE, (struct hw_device_t **)device);
} 
  在hardware/libhardware目录下新建lethe文件夹: 在lethe.c文件中主要导入符号HAL_MODULE_INFO_SYM,用来指向自定义模块,编写模块相关函数接口:
#include <malloc.h>
#include <stdint.h>
#include <string.h>
#include <log/log.h>
#include <hardware/lethe.h>
#include <hardware/hardware.h>

static int add(const struct lethe_device *dev, int a, int b, int *total)
{
        if (!dev) {
                return -1;
        }
        *total = a + b;
        return 0;
}

static int subtract(const struct lethe_device *dev, int a, int b, int *total)
{
        if (!dev) {
                return -1;
        }
        *total = a - b;
        return 0;
}

static int lethe_close(hw_device_t *dev)
{
        if(dev) {
                free(dev);
                return 0;
        } else {
                return -1;
        }
}

//打开设备函数
static int lethe_open(const hw_module_t* module,const char __unused *id,
                            hw_device_t** device)
{
    if (device == NULL) {
        ALOGE("NULL device on open");
        return -1;
    }

    lethe_device_t *dev = malloc(sizeof(lethe_device_t));
    memset(dev, 0, sizeof(lethe_device_t));

    dev->common.tag = HARDWARE_DEVICE_TAG;
    dev->common.version = LETHE_MODULE_API_VERSION_1_0;
    dev->common.module = (struct hw_module_t*) module;
    dev->common.close = lethe_close;
    dev->add = add;
    dev->subtract = subtract;

    *device = &(dev->common);
    return 0;
}

static struct hw_module_methods_t lethe_module_methods = {
    .open = lethe_open,
};

//导出符号HAL_MODULE_INFO_SYM,指向自定义模块
lethe_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag                = HARDWARE_MODULE_TAG,
        .module_api_version = LETHE_MODULE_API_VERSION_1_0,
        .hal_api_version    = HARDWARE_HAL_API_VERSION,
        .id                 = LETHE_HARDWARE_MODULE_ID,
        .name               = "lethe hal",
        .author             = "lethe",
        .methods            = &lethe_module_methods,
    },
};

 

编写Android.bp文件就可以生成自己的hal库:
cc_library_shared {                     //共享库,.so结尾                
        relative_install_path: "hw",
        proprietary: true,
        srcs: ["lethe.c"],
        header_libs: ["libhardware_headers"],
        shared_libs: ["liblog"],
}

 

Lethetest.cpp用来测试hal:
#include <hardware/hardware.h>                                                         
#include <hardware/lethe.h>
#include <log/log.h>

int main()
{
        lethe_device_t* lethe_device = NULL;

        const lethe_module_t *module = NULL;

        // 用来获取lethe模块
        int ret = hw_get_module(LETHE_HARDWARE_MODULE_ID, (const struct hw_module_t** )&module);

        if (!ret) {
                ret = lethe_open_test((const struct hw_module_t*)module, &lethe_device);
        }

        if (ret < 0) {
                ALOGE("get lethe hal failed ......");
                return -1; 
        }

        int total = 0;
        lethe_device->add(lethe_device, 5, 3, &total);
        ALOGE("[lethe]======== add 5 + 3 = %d", total);
        lethe_device->add(lethe_device, 5, 3, &total);
        ALOGE("[lethe]======== subtract  5 - 3 = %d", total);
}

 

执行./lethe_test进行hal测试,测试结果如下:
[lethe]======== add 5 + 3 = 8
[lethe]======== add 5 - 3 = 2

 

   

标签:HAL,lethe,int,hw,module,stub,device,hal
From: https://www.cnblogs.com/lethe1203/p/18115084

相关文章

  • 基于STM32HAL库的FreeRTOS学习(2)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言上一篇文章我们介绍了FreeRTOS的基础创建任务函数,这篇我们来介绍FreeRTOS的任务挂起与恢复函数。提示:以下是本篇文章正文内容,下面案例可供参考一、什么是任务挂起与恢复?在了解任务恢复之前,我们要先......
  • 【Vue3】readonly和shallowReadonly
    readonly()​接受一个对象(不论是响应式还是普通的)或是一个ref,返回一个原值的只读代理。类型functionreadonly<Textendsobject>(target:T):DeepReadonly<UnwrapNestedRefs<T>>只读代理是深层的:对任何嵌套属性的访问都将是只读的。它的ref解包行为与r......
  • 03-【HAL库】STM32实现SYN6288模块语音播报.md
    一、什么是SYN6288模块1、概述​ SYN6288中文语音合成芯片是北京宇音天下科技有限公司于2010年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片。SYN6288通过异步串口(UART)通讯方式,接收待合成的文本数据,实现文本到语音(或TTS语音)的转换。​ 宇音天下于2002年最......
  • STM32之HAL开发——Keil调试工具介绍
    Debug介绍 在Keil工具中有许多常用的小工具,下面将会依次为大家介绍每个工具的用途。命令行窗口 在窗口内可以输入一些指令,来进行断点设置以及删除,一般不常用反汇编窗口可以查看当前C代码的汇编指令标志窗口寄存器窗口可以用来查看......
  • JINGWHALE ABCDE 概念模型系统设计建模法,帮你规范系统产品设计,打造全链路的产品体验!
    《一种基于概念模型思想的ABCDE系统设计建模法的研究与应用》张云龙(JINGWHALE数字科学艺术创新中心,浙江杭州,310008)国作登字-2023-A-00087399摘要:本文基于概念模型思想提出了一种归纳设计纲领、梳理业务模型、抽象概念模型、具象设计模型、评估改进模型的ABCDE概......
  • Php_Code_challenge15
     题目:答案: 解析:对'..'进行限制禁止我们包含其他目录下的内容,也就不能对服务器日志及SESSION进行利用,我们对分析代码分析出题人贴心的给我们输出了上传后的文件名及路径,并且利用file_put_contents和file_get_contents进行文件的写入,这是很危险的输出上传文件名加上file_p......
  • JINGWHALE ART 年度流行色
     JINGWHALEART年度流行色是由JINGWHALE每年发布的年度流行色,于每年的1月1日发布次年的流行色。 JINGWHALEART年度流行色依据中国古典文化思想(如中国传统正五色、金木水火土、十二生肖等文化思想)、以及年度流行指数,确定年度流行色。基于年度流行色基准色,通过JINGWHALE-H......
  • Halcon深度学习项目实战
    Halcon在机器视觉中的价值主要体现在提供高效、可扩展、灵活的机器视觉解决方案,帮助用户解决各种复杂的机器视觉问题,提高生产效率和产品质量。缩短产品上市时间Halcon的灵活架构使其能够快速开发出任何类型的机器视觉应用。其全球通用的集成开发环境(HDevelop)有助于降低产品......
  • Proteus8.0仿真应用设计(十七)基于FreeRTOS、STM32F103C8、HAL库、DHT11、LCD12864的温
    一、简介:        DHT11是一款湿、温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个NTC测温元件。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。传感器内部......
  • YC263A [ 20240324 CQYC省选模拟赛 T1 ] 光晕 (halation)
    题意给定一个数组\(a\),每次进行以下操作。选择一个\(1\lex\len\),将\(a_x:=(a_x-2^{c_x})\times2\),然后\(c_x:=c_x+1\)如果通过这个操作使得\(a\)严格递增,则\(a\)是好的。你希望找到一个长度为\(n\)的好的数组,使得\(\suma_i\)最小,且她的字典序......