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