如何在硬件抽象层中增加硬件模块来和内核驱动程序交互。
这一小节中我们在Android系统为我们自己的硬件增加了一个硬件抽象层模块,但是现在Java应用程序还不能访问到我们的硬件。我们还必须编写JNI方法和在Android的Application Frameworks层增加API接口,才能让上层Application访问我们的硬件。在接下来的文章中,我们还将完成这一系统过程,使得我们能够在Java应用程序中访问我们自己定制的硬件。
添加led_hal.h和led_hal.c文件再Android指定目录下:
hardware/libhardware/include/hardware/led_hal.h
hardware/libhardware/modules/led/led_hal.c
HAL在运行时是在user space。
在led_hal.h中定义led_device_t
结构体:
#include
#include
#include
#include
__BEGIN_DECLS
struct led_device_t {
struct hw_device_t common;
int (*led_open)(struct led_device_t* dev);
int (*led_ctrl)(struct led_device_t* dev, int which, int status);
};
__END_DECLS
led_hal.c
中的步骤如下:
/* 1. 实现一个名为HMI的 hw_module_t 结构体 */
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.id = "led",
.methods = &led_module_methods,
};
static struct hw_module_methods_t led_module_methods = {
.open = led_device_open,
};
/* 2. 实现一个open函数, 它返回 led_device_t 结构体 */
static int led_device_open(const struct hw_module_t* module,