zoukankan      html  css  js  c++  java
  • Android 从上层到底层-----hal层

    CPU:RK3288

    系统:Android 5.1

    功能:上层 app 控制 led 亮灭

    开发板:Firefly RK3288

    led_hal.c

    path:hardware/rockchip/firefly/led_hal/led_hal.c

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <hardware/led_hal.h> //日志的标签 #define LOG_TAG "led_hal" #include <utils/Log.h> static int fd; int led_hal_dev_close(struct hw_device_t *device) { if(device != NULL) { struct led_hw_device_t *temp = (struct led_hw_device_t *)device; free(temp); } close(fd); return 0; } int led_hal_open_dev(void) { ALOGD("--%s--", __func__); fd = open("/dev/firefly_leds", O_RDWR); if(fd < 0) { ALOGE("open failed : %s", strerror(errno)); return fd; } return 0; } int led_hal_control_dev(int on) { ALOGD("--%s--", __func__); int ret; ret = write(fd, &on, 4); if(ret < 0) { ALOGE("control failed : %s", strerror(errno)); return ret; } return 0; } //该函数正确返回0 int led_hal_module_open(const struct hw_module_t *module, const char *id, struct hw_device_t **device) { ALOGD("--%s--", __func__); struct led_hw_device_t *led_dev = NULL; led_dev = (struct led_hw_device_t *)malloc(sizeof(struct led_hw_device_t)); if (led_dev == NULL) { ALOGE("malloc failed"); return -1; } ALOGD("malloc success"); //初始化device对象 led_dev->common.tag = HARDWARE_DEVICE_TAG; led_dev->common.version = 1; led_dev->common.module = module; led_dev->common.close = led_hal_dev_close; led_dev->open = led_hal_open_dev; led_dev->control = led_hal_control_dev; //将当前的led_dev传递给jni层 *device = (struct hw_device_t *)led_dev; return 0; } struct hw_module_methods_t led_hal_methods = { open : led_hal_module_open, }; //结构体名称必须为HMI struct led_hw_module_t HMI = { common : { tag : HARDWARE_MODULE_TAG, version_major : 1, version_minor : 0, //id必须与jni层的一致 id : LED_HAL_MODULE_ID, name : "firefly led hal module", methods : &led_hal_methods, }, };

    led_hal.h

    path:hardware/libhardware/include/hardware/led_hal.h

    #ifndef _LED_HAL_H_
    #define _LED_HAL_H_
    
    #include <hardware/hardware.h>
    
    #define LED_HAL_MODULE_ID    "firefly_led_hal"
    
    //自定义module对象,一定要继承父类,
    //可以扩展
    struct led_hw_module_t {
        //一定要在结构体第一位,名称必须是common
        struct hw_module_t    common;
        //下面是扩展,用于测试
        int test;
    };
    
    //自定义device对象,一定要继承父类
    //一定要扩展
    struct led_hw_device_t {
        //一定要在结构体第一位,名称必须是common
        struct hw_device_t common;
        //下面为扩展
        int (*open)(void);
        int (*control)(int on);
    };
    #endif

    Android.mk

    path:hardware/rockchip/firefly/led_hal/led_hal.c

    语法参照 Android.mk语法解析

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := firefly_led_hal.default
    LOCAL_SRC_FILES := led_hal.c
    LOCAL_LDLIBS    := -llog
    
    LOCAL_MODULE_TAGS := optional
    LOCAL_SHARED_LIBRARIES := liblog libcutils
    
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
    
    include $(BUILD_SHARED_LIBRARY)

    Android 从上层到底层-----kernel层

    Android 从上层到底层-----jni层

    Android 从上层到底层-----app层

  • 相关阅读:
    Springboot使用ehcache缓存
    Tomcat启用HTTPS协议配置过程
    细说document.ready和window.onload
    科技创新
    SpringBoot的ApplicationRunner
    禁用Chrome的“请停用以开发者模式运行的扩展程序”提示
    论文排版问题
    mathType换行等号对齐
    内部类调用外部类的成员,同名时怎么调用?
    Tomcat的manager app管理web项目
  • 原文地址:https://www.cnblogs.com/lialong1st/p/8868055.html
Copyright © 2011-2022 走看看