Android底层驱动开发记录:03_HAL

2 篇文章 0 订阅
2 篇文章 0 订阅

在上一节基础上增加HAL层代码

1、完成IoctrlJ25_hal.c,填充主要结构体hw_module_t

static struct ioctrlj25_device ioctrlj25_dev = {
	.common = {
		.close = ioctrlj25_close,
	},
	.ioctrlj25_open  = ioctrlj25_open,
	.ioctrlj25       = ioctrlj25,
};

/*
//可以定义在h文件中
typedef struct ioctrlj25_device {
    struct hw_device_t common;
	
	int (*ioctrlj25_open)(struct ioctrlj25_device* dev);
	int (*ioctrlj25)(struct ioctrlj25_device* dev,int which,int status);   
} ioctrlj25_device_t;
*/

static int ioctrlj25_device_open(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device)
{
	*device = &ioctrlj25_dev;
	return 0;
}


/*===========================================================================*/
/* Default ioctrlj25 HW module interface definition                           */
/*===========================================================================*/

static struct hw_module_methods_t ioctrlj25_module_methods = {
    .open = ioctrlj25_device_open,
};
/*参考
struct hw_module_t HAL_MODULE_INFO_SYM = {
    .tag = HARDWARE_MODULE_TAG,
    .module_api_version = VIBRATOR_API_VERSION,
    .hal_api_version = HARDWARE_HAL_API_VERSION,
    .id = VIBRATOR_HARDWARE_MODULE_ID,
    .name = "Default vibrator HAL",
    .author = "The Android Open Source Project",
    .methods = &vibrator_module_methods,
};
*/

struct hw_module_t HAL_MODULE_INFO_SYM = {
    .id = IOCTRLJ25_HARDWARE_MODULE_ID,
    .methods = &ioctrlj25_module_methods,
};

完成ioctrlj25_open,和ioctrlj25,此处 ioctrlj25_open和ioctrlj25_device_open并不相同,后者时用来打开设备的。

2、修改com_android_server_IoctrlJ25Service.cpp

jint ioctrlj25open(JNIEnv *env, jobject cls)
{
	jint err;
	hw_module_t* module;
	hw_device_t* device;
	
	ALOGI("native ioctrlj25 open");
	/* 1. hw_get_module*/
	err = hw_get_module("ioctrlj25",(hw_module_t const**)&module);
	if(err == 0){
		/* 2. get device : module->methods->open*/
		err = module->methods->open(module,NULL,&device);
		if(err == 0){
			ioctrlj25_dev = (ioctrlj25_device_t*)device;
			/* 3. call ioctrlj25_open*/
			return ioctrlj25_dev->ioctrlj25_open(ioctrlj25_dev);
		}
	}	
	ALOGI("native ioctrlj25 open fail");
	return -1;
}

jint ioctrlj25ctl(JNIEnv *env, jobject cls, jint which, jint status)
{
	ALOGI("native ioctrlj25 ctrl: id=%d status=%d\r\n",which,status);
	return ioctrlj25_dev->ioctrlj25(ioctrlj25_dev,which,status);
}

其他基本不用修改。

3、

上传文件
frameworks/base/services/core/jni/com_android_server_IoctrlJ25Service.cpp
hardware/libhardware/include/hardware/IoctrlJ25_hal.h
hardware/libhardware/modules/IoctrlJ25/IoctrlJ25_hal.c
hardware/libhardware/modules/IoctrlJ25/Android.mk

Android.mk : 
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := ioctrlj25.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 := IoctrlJ25_hal.c
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)


编译
mmm hardware/libhardware/modules/IoctrlJ25/
mmm frameworks/base/services/
打包编译,下载测试完成

这一节基本上就是这样了,如雷贯耳的HAL就这么简单,但具体生成的so动态库如何在实际项目中使用,还不知道,需要继续学习,也欢迎大家指点。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值