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目录下有相关文件。

原文地址:https://www.cnblogs.com/ynxf/p/5893098.html