zoukankan      html  css  js  c++  java
  • Android驱动入门-LED--HAL硬件抽象层程序设计①

    硬件平台: FriendlyARM Tiny4412 Cortex-A9

    操作系统: UBUNTU 14.04 LTS

    时间:2016-09-21  16:15:26

    设计HAL硬件抽象层程序,则需要打开Android源代码。

    在 Android-5.0.2hardwarelibhardwaremodules目录下都是HAL文件。

    创建LED文件夹。在文件夹中创建led.c文件。

    #include <cutils/log.h>
    #include <fcntl.h>
    #include <string.h>
    #include <hardware/led.h>  //自己创建的头文件
    #include <stdbool.h>
    #include <stdint.h>
    #include <sys/cdefs.h>
    #include <sys/types.h>
    #include <sys/ioctl.h>
    #include <hardware/hardware.h>
    
    #define LOG_TAG "ledhal"    //打印调试信息  方便在查看调试信息时筛选
    
    static int fd;
    
    int led_on(struct led_device_t *dev, int no )
    {
        ioctl( fd, LED_ON, no );
        return 0;
    }
    
    int led_off(struct led_device_t *dev, int no )
    {
        ioctl( fd, LED_OFF, no );
        return 0;
    }
    
    static int led_close(hw_device_t *dev) {
        struct led_device_t *led = (struct led_device_t *)dev;   //强制转换指针类型 
        free(led);          //在这里 在退出程序时释放掉之前的申请的空间
    
        close(fd);
    
        return 0;
    }
    
    static struct led_device_t led_dev = {    //此处已经静态分配自己定义的结构体空间
        .led_device = {
            .tag = HARDWARE_DEVICE_TAG,  //固定格式
            .close = led_close,
        },
    
        .set_on = led_on,
        .set_off = led_off,
    };
    
    static int open_led_hal(const hw_module_t* module, const char* name,
            hw_device_t** device) 
    {
        *device = &led_dev;            //直接赋值已静态分配的结构体指针
        fd = open( "/dev/my_led",O_RDWR );
        if( fd<0 )
        {
            ALOGD("open device file failed
    ");    //  logcat -s ledhal 
            return 1;
        }
        return 0;
    }
    
    static struct hw_module_methods_t led_methods = {
        .open = open_led_hal,      //在程序启动时自动执行
    };
    struct hw_module_t HAL_MODULE_INFO_SYM = {        //程序入口
        
            .tag = HARDWARE_MODULE_TAG,
            .id = "led",
            .methods = &led_methods,            //首先调用其中的open函数
       
    };

    在 Android-5.0.2hardwarelibhardwareincludehardware 下创建头文件led.h

    #ifndef _HARDWARE_LED_H
    #define _HARDWARE_LED_H
    
    #include <hardware/hardware.h>
    
    struct led_device_t {      //自己设定的结构体
        struct hw_device_t led_device;  //此成员为固定格式
        int (*set_on)(struct led_device_t *dev, int no );
        int (*set_off)(struct led_device_t *dev, int no );
    
    };
    
    #define LED_ON _IOW('G',0,int)
    #define LED_OFF _IOW('G',1,int)
    
    #endif  

    在 Android-5.0.2hardwarelibhardwaremodules 目录下创建Android.mk文件,这里我是复制其他文件夹中的。

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := led.default    //生成的库名称
    
    # HAL module implementation stored in
    # hw/<VIBRATOR_HARDWARE_MODULE_ID>.default.so
    LOCAL_MODULE_RELATIVE_PATH := hw
    LOCAL_C_INCLUDES := hardware/libhardware
    LOCAL_SRC_FILES := led_hal.c  //源文件名称
    LOCAL_SHARED_LIBRARIES := liblog
    LOCAL_MODULE_TAGS := eng    //这里我选用的是工程模式
    
    include $(BUILD_SHARED_LIBRARY)

    上面有注释的代表是需要修改的地方。

    然后退到Android源代码的目录。执行命令生成相关文件。

     mmm hardware/libhardware/modules/led/

    将在 out/target/product/tiny4412/system/lib/hw/ 目录下生成相关文件。

    在执行 ./gen-img.sh  将生成新的system.img文件  重新安装安卓系统,在控制台模式下,可看到在systemlibhw目录下有相关文件。

  • 相关阅读:
    JSON
    什么是Jsonp?
    用border做三角形
    前端模块化
    Web 前端
    前端性能优化
    Ajax的原理
    node.js基础语法
    【真·新手初篇】菜鸟们都戳进来看看(欢迎大神指导)
    2019.11.20 开启一天的工作
  • 原文地址:https://www.cnblogs.com/ynxf/p/5893098.html
Copyright © 2011-2022 走看看