Android HAL层实现与调用

BOOST 电路图腾柱驱动设计:SS8050/SS8550 驱动 IRF640N 的 3 个关键问题与实测 本文详细分析了BOOST电路中采用SS8050/SS8550图腾柱驱动IRF640N MOSFET的三个关键问题,包括PNP管工作状态、限流电阻选择及基极电阻优化。通过实测数据验证了设计决策,提供了效率优化技巧和常见故障解决方案,适用于高频开关电源设计。 阅读详情

-----------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://blog.youkuaiyun.com/android_huber
交流邮箱:dp.shao@gmail.com
-----------------------------------------------------------------------

AndroidHAL层实现与调用

1.HAL层实现

     在这篇文章中我们讨论下HAL层代码的简单组成,以及jni是如何调用HAL层代码。文章尽量避免了一些无用信息,直接写有实际的东西。

    在这里我用一个简单的HAL层代码(电子防眩目的hal代码)来开始我们的讲解。

     在一个hal代码中主要的工作是实现一个名为HAL_MODULE_INFO_SYM的module实例,其结构定义为

struct lcd_reflect_module_t {
    struct hw_module_t common;
};

可以看到这个结构的名字是随意的,一般用(模块名_module_t)来表示,可以看到它只有一个成员变量hw_module_t,也就是说主要的工作就是填充这个hw_module_t这个结构了。

const struct lcd_reflect_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .version_major = 1,
        .version_minor = 0,
        .id = LCD_REFLECT_HARDWARE_MODULE_ID,
        .name = "LCD Reflect",
        .author = "Archermind Tech.",
        .methods = &lcd_reflect_module_methods,
    }
};

    可以看到其中只有一个open函数指针,作为module的callback。

     前面我们已经接触了两个重要的结构体,hw_module_t和hw_module_methods_t,下面我们还需要来看一下hal层中第三个重要的结构体hw_device_t。

     下面我们来看一下hw_module_methods_t中的open函数lcd_reflect_module_methods。

static int
lcd_reflect_open(const struct hw_module_t *module,

              const char *name, struct hw_device_t **device)
{
    int status = -EINVAL;

    LOGV("lcd_reflect_open\n");
    if (!strcmp(name, LCD_REFLECT_HARDWARE)) {
        struct lcd_reflect_device_t *dev;

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

        dev->common.tag = HARDWARE_DEVICE_TAG;
        dev->common.version = 0;
        dev->common.module = (struct hw_module_t *)module;
        dev->common.close = lcd_reflect_close;

        *device = &dev->common;

        dev->get_level = &lcd_reflect_get_level;
        dev->set_level = &lcd_reflect_set_level;
        dev->get_state = &lcd_reflect_get_state;
        dev->set_state = &lcd_reflect_set_state;

        status = 0;
    }
    
    return status;
}

    可以看到hw_device_t作为open的形参传入open函数中,并且我们还发现了另外一个结构体structlcd_reflect_device_t*dev;这个结构是我们模块自己定义的,用于存放一些我们模块需要的操作,jni层中就是通过这个结构体来调用hal层中提供的接口的。看一下它的定义。

struct lcd_reflect_device_t {
    struct hw_device_t common;

    /**
     * Get the mxc_reflect state
     *
     * Returns: 0 on success, error code on failure
     */
    int (*get_state)(struct lcd_reflect_device_t *dev,
                     int *stat);

    /**
     * Set the mxc_reflect state
     *
     * Returns: 0 on success, error code on failure
     */
    int (*set_state)(struct lcd_reflect_device_t *dev,
                     int stat);

    /**
     * Get the mxc_reflect level
     *
     * Returns: 0 on success, error code on failure
     */
    int (*get_level)(struct lcd_reflect_device_t *dev,
                    int *level);

    /**
     * Set the mxc_reflect state
     *
     * Returns: 0 on success, error code on failure
     */
    int (*set_level)(struct lcd_reflect_device_t *dev,
                    int level);
};

里面有hw_device_t这个成员,并且它是在最前面的一个成员,这个是非常重要的,我们将在下面说明为什么它需要放在最前面,除了hw_device_t就是一些hal层需要提供给jni调用的函数指针。

再回到open函数中,现在我们就能看懂这个open函数所做的工作了,它首先注册了一个structlcd_reflect_device_t *dev; lcd_reflect_device_t变量,然后填充common,也就是hw_device_t这个结构,这里需要注意有几个成员:

tag:必须指定为HARDWARE_DEVICE_TAG

    还需要实现一个close函数,接着*device= &dev->common;,即让jni的hw_device_t与hal中的lcd_reflect_device_t联系在一起了,由于common这个成员在lcd_reflect_device_t的最前面定义的,那么也就是lcd_reflect_device_t的地址和common的地址是相同的。只要知道common的地址就可以知道lcd_reflect_device_t的地址,这样lcd_reflect_device_t结构就可以传送到jni层使用了,只需要将common的地址强制转换一下即可。最后把hal层需要提供给jni的API实现就可以了。

这样一个简单的hal层代码框架就有啦。

2.调用HAL层

     在jni层,我们通过hw_get_module函数得到hw_module_t结构,如下:

hw_get_module(LCD_REFLECT_HARDWARE_MODULE_ID,(hw_module_t const**)&module);

通过指定LCD_REFLECT_HARDWARE_MODULE_ID来区别module,接着还需要得到lcd_reflect_device_t*device;这个结构,我们可以通过下面这个函数实现:

static lcd_reflect_device_t *
get_device(hw_module_t *module, char const *name)
{
    int err;
    hw_device_t *device;

    err = module->methods->open(module, name, &device);
    if (err == 0) {
        return (lcd_reflect_device_t *)device;
    } else {
        return NULL;
    }
}
   
函数返回的是lcd_reflect_device_t结构的地址,在函数中首先定义hw_device_t*device;接着将其通过module->methods->open(module,name, &device);得到hw_device_t这个结构的地址,接着将这个地址返回,返回前需要将地址类型强制转换一下,(lcd_reflect_device_t*)device,这样就得到lcd_reflect_device_t这个结构的地址啦。原因我们在上面讲过,是因为hw_device_t和lcd_reflect_device_t两个结构的首地址是相同的。

     有了lcd_reflect_device_t我们就可以调用hal层中实现的API啦,通过这些API操作硬件。



Android平台Framework层获取和处理按键事件流程详解 通过判断按键码和动作,开发者可以根据需要执行相应的逻辑。以上是获取和处理按键事件的基本流程,你可以根据具体需求进行扩展和优化。在Android应用中,我们需要注册一个按键事件监听器来接收按键事件。在Android平台的应用开发中,按键事件的获取和处理是非常重要的一部分。在RK3568平台上,获取和处理按键事件的流程如下所述。一旦注册了按键事件监听器,我们就可以获取按键事件并进行处理。获取按键的动作(按下、抬起等),然后根据需要进行相应的处理。来判断按键的类型和状态,并进行相应的处理。方法来处理按键事件。 阅读详情

相关推荐

Android 14.0 app调用hal层接口功能实现系列四(app层实现)

在14.0的产品rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在framework层实现添加服务调用jni接口,最后在app中实现对hal层的调用,接下来就来具体实现这个功能

安卓兼职framework和app工程师的博客 347

struct hw_module_t HAL_MODULE_INFO_SYM

先开个头,准备这与一篇struct hw_module_t HAL_MODULE_INFO_SYM 相关的文章。

liuxd3000的专栏 5006

Android10.0 app调用hal层接口功能实现系列一

在10.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后通过jni来调用

安卓兼职framework和app工程师的博客 1765

随笔录:Android—HAL层(一)

一、什么是HAL层? 为什么需要用到HAL层?可以参考一下连接 答:https://blog.youkuaiyun.com/shift_wwx/article/details/49000305在这里面 2、由内核底层思考,当我们写好了驱动怎么向上提供给HAL层? 首先当我写好了对应的驱动模块,生成驱动文件和设备节点文件。之后怎么去使用上安卓的HAL? 开始之前我们看看 android/hardware/lib...

qq_42856778的博客 603

Android13.0 app调用hal层接口功能实现系列三(frameworks层实现)

在13.0的系统产品定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在framework层实现添加服务调用jni接口,接下来就实现第三部分的相关功能

安卓兼职framework和app工程师的博客 1043

Android10.0 app调用hal层接口功能实现系列二(jni层实现)

在10.0的系统rom定制化开发中,在进行一些hal层的开发中国,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用

安卓兼职framework和app工程师的博客 911

HAL层代码

之前实现好了linux底层的模拟自设备驱动freg和测试程序后,下面开始学习android下的硬件抽象层,hardware层,也叫HAL层。 主要的文件: hardware/libhardware/hardware.c hardware/libhardware/include/hardware/hardware.h Android的HAL层是Android系统对底层硬件操作屏蔽的一个中

xiaohuima_dong的专栏 1981

Android12.0 app调用hal层接口功能实现系列三(frameworks层实现)

在12.0的系统产品定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在framework层实现添加服务调用jni接口,接下来就实现第三部分的相关功能

安卓兼职framework和app工程师的博客 740

Android11.0 app调用hal层接口功能实现系列二(jni层功能实现)

在11.0的系统rom定制化开发中,在进行一些hal层的开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求, 这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,接下来就在framework层中 建立jni的文件来调用hal层接口

安卓兼职framework和app工程师的博客 1051

Android10.0 app调用hal层接口功能实现系列三(frameworks层实现)

在10.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在 framework层实现添加服务调用jni接口

安卓兼职framework和app工程师的博客 1037

Android 12.0 app调用hal层接口功能实现系列四(app层实现)

在12.0的产品rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在framework层实现添加服务调用jni接口,最后在app中实现对hal层的调用,接下来就来具体实现这个功能

安卓兼职framework和app工程师的博客 2020

Android 12.0 app调用hal层接口功能实现系列二(jni层功能实现)

在12.0的系统rom定制化开发中,在进行一些hal层的开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求, 这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,接下来就在framework层中 建立jni的文件来调用hal层接口

安卓兼职framework和app工程师的博客 669

Android11.0 app调用hal层接口功能实现系列三(frameworks层实现)

在11.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在 framework层实现添加服务调用jni接口

安卓兼职framework和app工程师的博客 1056

Android11.0 app调用hal层接口功能实现系列四(app层实现)

在11.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在 framework层实现添加服务调用jni接口,最后在app中实现对hal层的调用

安卓兼职framework和app工程师的博客 865

Android10.0 app调用hal层接口功能实现系列四(app层实现)

在10.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要 打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在 framework层实现添加服务调用jni接口,最后在app中实现对hal层的调用

安卓兼职framework和app工程师的博客 877

Android 13.0 app调用hal层接口功能实现系列二(jni层功能实现)

在13.0的系统rom定制化开发中,在进行一些hal层的开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求, 这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,接下来就在framework层中 建立jni的文件来调用hal层接口

安卓兼职framework和app工程师的博客 1089
上一篇: oops的解读方法-----怎么通过oops查找源码行
下一篇: 入门视频采集与处理(BT656简介)
huber
博客等级 码龄15年 79粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值