HAL编写目的:
frameworks层的JNI向上提供本地函数,向下加载HAL文件并调用HAL函数,HAL负责问驱动执行硬件操作。
1:frameworks层的JNI怎么使用HAL?
a.调用hw_get_module 获得一个hw_module_t结构体。
b:module-->methods->open(module,device_name,&device);最后得到device,就是
hw_module_t结构体。并且把hw_module_t结构体转为自定义设备结构体。(问一:为什么可以这样转?下面有解释)
2:HAL怎么写?
a:实现一个名为HMI的为hw_module_t结构体。
b:实现一个open函数,会根据name返回一个设备自定义的结构体。
C: 这个设备自定义的结构体第一个成员就是hw_module_t结构体。(回答问一:设备自定义的结构体第一个成员为hw_module_t结构体,他们的首地址相同。)
----------------------------------------------------------------------------------------------------------
在“我的收藏”的《Android硬件访问服务-Service》文章
a:在上面的基础上,把JNI里的操作硬件的代码再分离出来一个HAL层,在这个HAL层里操作底层的驱动。(app->系统service->frameworks层JNI->HAL->底层驱动)
从上面的JNI里分离出HAL操作底层硬件:
先定义一个头文件:
#ifndef ANDROID_LED_INTERFACE_H
#define ANDROID_LED_INTERFACE_H
#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <hardware/hardware.h>
__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
#endif // ANDROID_LED_INTERFACE_H
----------------------------------------------------------------------------
HAL的C文件:
#define LOG_TAG "LedHal"
/* 1. 实现一个名为HMI的hw_module_t结构体 */
/* 2. 实现一个open函数, 它返回led_device_t结构体 */
/* 3. 实现led_device_t结构体 */
/* 参考 hardware\libhardware\modules\vibrator\vibrator.c
*/
#include <hardware/vibrator.h>
#include <hardware/hardware.h>
#include <cutils/log.h>
#include <stdio.h>
#include <unistd.h>
#in