Android底层开发(二)之HAL层 第二步
2015-06-03 20:12
417 查看
1
HAL程序必须要一个HAL-MODULE-INFO——SYM(hw_module_t)变量,有了这个才能被Android系统调用。类似于(C函数的main()和linux驱动程序的init()函数)
2 HAL编程是三个关键结构体:
struct hw_module_t; (HAL模块 中)
struct hw_module_methods_t; (入口函数 小)
struct hw_device_t; (HAL设备 大)
这几个数据结构是在Android工作目录/hardware/libhardware/include/hardware/hardware.h文件中定义.
3 源程序
3.1 leds_hal.h
#include <hardware/hardware.h>
#include <fcntl.h>
#include <cutils/log.h>
struct led_module_t
{
struct hw_module_t hw_module;
};
struct led_control_device_t
{
struct hw_device_t hw_device;
int (*set_on)(struct led_control_device_t *dev, int32_t led);
int (*set_off)(struct led_control_device_t *dev, int32_t led);
};
#define LED_HARDWARE_MODULE_ID "led_hal"
3.2 leds_hal.c
#include "leds_hal.h"
int dev_file = 0;
int led_on(struct led_control_device_t *dev, int32_t led)
{
return ioctl(dev_file, 1, led);
}
int led_off(struct led_control_device_t *dev, int32_t led)
{
return ioctl(dev_file, 0, led);
}
int led_device_close(struct hw_device_t* device)
{
struct led_control_device_t* ctx = (struct led_control_device_t*) device;
if (ctx)
{
free(ctx);
}
close(dev_file);
return 0;
}
static int led_device_open(const struct hw_module_t* module, const char* name,
struct hw_device_t** device)
{
struct led_control_device_t *dev;
dev = (struct led_control_device_t *) malloc(sizeof(*dev));
memset(dev, 0, sizeof(*dev));
dev->hw_device.tag = HARDWARE_DEVICE_TAG;
dev->hw_device.version = 0;
dev->hw_device.module = (struct hw_module_t*) module;
dev->hw_device.close = led_device_close;
dev->set_on = led_on;
dev->set_off = led_off;
//*device = &dev->hw_device;
*device = (hw_device_t*)dev;
dev_file = open("/dev/leds", O_RDWR);
if (dev_file < 0)
{
LOGI("LED Stub: open /dev/leds fail.");
}
else
{
LOGI("LED Stub: open /dev/leds success .");
}
//leds_init_gpm();
return 0;
}
static struct hw_module_methods_t led_module_methods =
{ open: led_device_open };
struct led_module_t HAL_MODULE_INFO_SYM =
{ hw_module:
{ tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id
: LED_HARDWARE_MODULE_ID,
name: "Sample LED HAL Stub",
author: "Lining",
methods: &led_module_methods,
}
};
4 Android.mk文件与分析
第一步:
HAL模块属于android系统的一部分,HAL需要很多的Android的头文件和共享库,采用办法如下:建立链接
ln -s /root/drivers/ch09/leds_hal/ /working/android2.3.4_src/hardware/leds_hal
第二步 采用mm命令编译
Android.mk文件如下:
LOCAL_PATH := $(call my-dir) //返回当前路径
include $(CLEAR_VARS) //清楚...变量
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
//编译出来的.so文件存放地方
LOCAL_SHARED_LIBRARIES := liblog //本次编译要链接动态库文件liblog.so文件
LOCAL_SRC_FILES := leds_hal.c
LOCAL_MODULE :=led_hal.default //编译生成led_hal.default.so
LOCAL_MODULE_TAGS := eng
include $(BUILD_SHARED_LIBRARY) //编译器负责
第三步:把生成的led_hal.default.so传入开发板的/system/lib/hw中。
HAL程序必须要一个HAL-MODULE-INFO——SYM(hw_module_t)变量,有了这个才能被Android系统调用。类似于(C函数的main()和linux驱动程序的init()函数)
2 HAL编程是三个关键结构体:
struct hw_module_t; (HAL模块 中)
struct hw_module_methods_t; (入口函数 小)
struct hw_device_t; (HAL设备 大)
这几个数据结构是在Android工作目录/hardware/libhardware/include/hardware/hardware.h文件中定义.
3 源程序
3.1 leds_hal.h
#include <hardware/hardware.h>
#include <fcntl.h>
#include <cutils/log.h>
struct led_module_t
{
struct hw_module_t hw_module;
};
struct led_control_device_t
{
struct hw_device_t hw_device;
int (*set_on)(struct led_control_device_t *dev, int32_t led);
int (*set_off)(struct led_control_device_t *dev, int32_t led);
};
#define LED_HARDWARE_MODULE_ID "led_hal"
3.2 leds_hal.c
#include "leds_hal.h"
int dev_file = 0;
int led_on(struct led_control_device_t *dev, int32_t led)
{
return ioctl(dev_file, 1, led);
}
int led_off(struct led_control_device_t *dev, int32_t led)
{
return ioctl(dev_file, 0, led);
}
int led_device_close(struct hw_device_t* device)
{
struct led_control_device_t* ctx = (struct led_control_device_t*) device;
if (ctx)
{
free(ctx);
}
close(dev_file);
return 0;
}
static int led_device_open(const struct hw_module_t* module, const char* name,
struct hw_device_t** device)
{
struct led_control_device_t *dev;
dev = (struct led_control_device_t *) malloc(sizeof(*dev));
memset(dev, 0, sizeof(*dev));
dev->hw_device.tag = HARDWARE_DEVICE_TAG;
dev->hw_device.version = 0;
dev->hw_device.module = (struct hw_module_t*) module;
dev->hw_device.close = led_device_close;
dev->set_on = led_on;
dev->set_off = led_off;
//*device = &dev->hw_device;
*device = (hw_device_t*)dev;
dev_file = open("/dev/leds", O_RDWR);
if (dev_file < 0)
{
LOGI("LED Stub: open /dev/leds fail.");
}
else
{
LOGI("LED Stub: open /dev/leds success .");
}
//leds_init_gpm();
return 0;
}
static struct hw_module_methods_t led_module_methods =
{ open: led_device_open };
struct led_module_t HAL_MODULE_INFO_SYM =
{ hw_module:
{ tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id
: LED_HARDWARE_MODULE_ID,
name: "Sample LED HAL Stub",
author: "Lining",
methods: &led_module_methods,
}
};
4 Android.mk文件与分析
第一步:
HAL模块属于android系统的一部分,HAL需要很多的Android的头文件和共享库,采用办法如下:建立链接
ln -s /root/drivers/ch09/leds_hal/ /working/android2.3.4_src/hardware/leds_hal
第二步 采用mm命令编译
Android.mk文件如下:
LOCAL_PATH := $(call my-dir) //返回当前路径
include $(CLEAR_VARS) //清楚...变量
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
//编译出来的.so文件存放地方
LOCAL_SHARED_LIBRARIES := liblog //本次编译要链接动态库文件liblog.so文件
LOCAL_SRC_FILES := leds_hal.c
LOCAL_MODULE :=led_hal.default //编译生成led_hal.default.so
LOCAL_MODULE_TAGS := eng
include $(BUILD_SHARED_LIBRARY) //编译器负责
第三步:把生成的led_hal.default.so传入开发板的/system/lib/hw中。
相关文章推荐
- Android开发之旅:环境搭建及HelloWorld
- Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解
- android studio Mac快捷键介绍
- android小应用,只能播放一首歌的应用
- Android studio下搭建svn
- Android Dalvik虚拟机简述(与Java虚拟机的区别和简要的执行原理)
- android ViewPager+FragmentStatePagerAdapter无限循环FragmentStatePagerAdapter
- Android如何设置横竖屏
- Android 应用性能优化(三) 多核下的多线程计算
- Android 4.4 KitKat NotificationManagerService使用具体解释与原理分析(一)__使用具体解释
- Android更换皮肤解决方案
- Android 自定义view 的绘制时机 问题
- Android手机客户端与服务器之间的通信、Android手机客户端通过服务器与Android手机客户端之间的通信---------阿冬专栏!!!
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
- Android学习资源
- Android 强制横屏或竖屏注意事项及onConfigurationChanged的使用
- android px转换为dip/dp
- Android中的volley_5_字节数组缓冲池ByteArrayPool 和使用缓冲池技术的自定义的PoolingByteArrayOutputStream
- Android开发命名规范
- Android Handler的使用