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

发布时间:2020-10-15 22:28:04 作者:lilin9105
来源:网络 阅读:1272

两个与hal有关的结构体 hw_module_t ,hw_device_t

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


一、jni和hal之间的关系

    Tip:几种app,jni,hal,framework之间的关系框架

[android底层] hal硬件抽象层编写    这篇文章用的框架是第二种框架的编写,他们的关系如下;

    可以看出jni主要通过pModule和pdevice来获取hal中的变量来操作hal层

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

二、jni操作hal

    获取hal层:1、jni获取hal层的module和device对象

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

    操作hal:2、jni操作hal层

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

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

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

jni操作hal完整代码参考[android底层]jni中获取自定义的类函数编写    来对比

三、hal的编写

编写hal注意点(注释部分)

1、HAL的.h文件的编写,自己的硬件自定义的modules和device的编写;以led为例子[android底层] hal硬件抽象层编写

2、HAL的.c文件的编写的步骤

编写hal的两个核心

    一个结构体hw_module_t的结构体

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

    一个hw_module_methods_t中的open函数;

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


hal编写步骤

第一步:hal一切从HMI开始

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

第二步:

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

第三步: 实现jni获取设备(hw_device_t)操作的函数

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

四、实现jni调用的释放(free)设备(hw_device_t)的函数,与第三步意图相反

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


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

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



完整代码

hal_led.h

#ifndef __HAL_LED_H__ 
#define __HAL_LED_H__ 
#include <hardware/hardware.h> 
 
#define LED_MODULE_ID "myled_hal" //目标文件名称: libhal_jni_test.so 
struct led_hal_modules{ 
    struct hw_module_t common;//必须这个名称(约定) 
}; 
struct led_hal_device{ 
    struct hw_device_t common;//必须这个名称(约定) 
    //下面是设备相关自定义函数 
    int (*open)(); 
    int (*ledoff)(); 
    int (*ledon)(); 
}; 
 
#endif

hal_led.c

#define LOG_TAG "myled_hal" 
 
#include <stdlib.h> 
#include "hal_led.h" 
#include <hardware/hardware.h> 
#include <cutils/log.h> 
 
/* 4、实现hw_device_t中的close函数来关闭设备, 
与hw_module_methods_t中的open相反; 
    ps:函数原型int (*close)(struct hw_device_t* device);*/ 
int  mydev_close(struct hw_device_t* device){ 
    struct led_hal_device* tmp; 
    if(device != NULL){ 
    tmp = (struct led_hal_device*)device; 
    free(tmp); 
    } 
    return 0; 
} 
 
// 5、实现led_hal_device的自定义函数 
int mydev_open(){ 
    //open(/dev/leds1, flags); 
    return 0; 
} 
int ledoff(){ 
    //val = 1; 
    //write(fd, &val, 4); 
    return 0; 
} 
int ledon(){ 
    //val =0; 
    //write(fd, &val, 4); 
    return 0; 
} 
 
 
    // 3、通过open来分配并返回hw_device_t 给jni调用操作 
int myled_hal_open(const struct hw_module_t* module, const char* id, 
struct hw_device_t** device){ 
    // 3.1、分配一个hw_device_t空间 
    struct led_hal_device *mydev = (struct led_hal_device *)malloc(sizeof(struct led_hal_device *)); 
 
    if(mydev == NULL){ 
    LOGE("malloc error"); 
    exit(1); 
    } 
 
    mydev->common.tag = HARDWARE_DEVICE_TAG; 
    mydev->common.module = module; 
    mydev->common.version = 1; 
 
    //参照第4 步,hw_device_t中的close函数来关闭设备 
    mydev->common.close = mydev_close; 
 
    //led_hal_device自定义函数 
    mydev->open = mydev_open; 
    mydev->ledoff = ledoff; 
    mydev->ledon = ledon; 
 
    // 3.2、向jni传递device对象给jni调用操作
    // 6、记得第三步的3.2步骤中 在open函数中向jni返回hw_device_t 
    *device = ( struct hw_device_t*)mydev; 
 
    return 0; 
    } 
 
 
/*    2、本结构体主要作用使得jni通过open(.., .., 
    struct hw_device_t** device)的device来获取hw_device_t 设备*/ 
static struct hw_module_methods_t myled_module_methods= { 
    open:myled_hal_open//参照第3 步 
}; 
 
    // 1、结构体名称必须是这样HMI 
struct led_hal_modules HMI = { 
        common:{ 
            tag: HARDWARE_MODULE_TAG,//tag必须这个 
            version_major: 1,//主设备版本 
            version_minor: 0,//次设备的版本 
            id: LED_MODULE_ID,//.so动态库的名称(char *型) 
            name: "Graphics Memory Allocator Module",
            author: "The Android Open Source Project",
            methods: &myled_module_methods,//hw_module_methods_t,参见第2 步 
        }, 
         
};

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= myled_hal.default
LOCAL_SRC_FILES:= \
    hal_led.c
LOCAL_SHARED_LIBRARIES := \
    libutils
include $(BUILD_SHARED_LIBRARY)


推荐阅读:
  1. ASP.NET是什么语言?有什么特点?
  2. Python实现的redis分布式锁功能示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hal android jni硬件抽象层

上一篇:详解vue2.0的Element UI的表格table列时间戳格式化

下一篇:jQuery操作之效果详解

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》