1. 初始化Camera HAL模块
任务说明
本案例目标是在高通平台Camera HAL层实现模块的加载与初始化:通过hw_get_module获取Camera硬件模块,打开设备并设置通知回调,最后校验模块名称、版本及API信息是否正确。案例基于Android HAL标准接口,适用于高通SM8250等平台。
核心代码实现
// camera_hal_init.c
#include <stdio.h>
#include <string.h>
#include <hardware/hardware.h>
#include <hardware/camera_common.h>
#include <cutils/log.h>
#define CAMERA_HAL_MODULE_ID "camera"
#define EXPECTED_HAL_VERSION HARDWARE_MODULE_API_VERSION(1, 0)
// 回调函数:用于接收相机事件通知
static void camera_notify_callback(int32_t msg_type,
int32_t ext1,
int32_t ext2,
void *user_data) {
ALOGI("Camera notify callback: msg=%d, ext1=%d, ext2=%d",
msg_type, ext1, ext2);
// 实际项目中在此处理错误、闪灯、人脸检测等异步事件
}
// 模块初始化入口
int camera_hal_initialize(void) {
const hw_module_t *hw_module = NULL;
camera_module_t *camera_module = NULL;
int ret = 0;
// 1. 加载Camera HAL硬件模块
ret = hw_get_module(CAMERA_HAL_MODULE_ID, &hw_module);
if (ret != 0) {
ALOGE("Failed to load camera HAL module: %s", strerror(-ret));
return ret;
}
// 2. 将通用模块结构转换为Camera模块结构
camera_module = (camera_module_t *)hw_module;
// 3. 设置通知回调函数
if (camera_module->notify_callback == NULL) {
ALOGE("notify_callback is NULL in camera module");
return -EINVAL;
}
camera_module->notify_callback = camera_notify_callback;
// 4. 验证模块信息
if (strcmp(hw_module->name, "Camera Module") != 0) {
ALOGE("Unexpected camera module name: %s", hw_module->name);
return -EINVAL;
}
if (hw_module->module_api_version != EXPECTED_HAL_VERSION) {
ALOGE("Camera HAL version mismatch: got %d, expected %d",
hw_module->module_api_version, EXPECTED_HAL_VERSION);
return -EINVAL;
}
if (camera_module->common.methods == NULL ||
camera_module->common.methods->open == NULL) {
ALOGE("Camera module methods or open is NULL");
return -EINVAL;
}
// 5. 打印模块关键信息用于验证
ALOGI("Camera HAL module loaded successfully:");
ALOGI(" Module name: %s", hw_module->name);
ALOGI(" Module author: %s", hw_module->author);
ALOGI(" Module API version: %d.%d",
(hw_module->module_api_version >> 8) & 0xFF,
hw_module->module_api_version & 0xFF);
ALOGI(" HAL API version: %d.%d",
(hw_module->hal_api_version >> 8) & 0xFF,
hw_module->hal_api_version & 0xFF);
return 0;
}
// 测试入口
int main(void) {
int ret = camera_hal_initialize();
if (ret == 0) {
ALOGI("Camera HAL initialization test PASSED");
} else {
ALOGE("Camera HAL initialization test FAILED with error %d", ret);
}
return ret;
}
编译与依赖
在Android源码树中,将上述文件置于vendor/qcom/proprietary/camera-hal/tests/目录,并添加以下Android.bp构建配置:
// Android.bp
cc_binary {
name: "camera_hal_init_test",
srcs: ["camera_hal_init.c"],
shared_libs: [
"libhardware",
"libcutils",
"liblog",
],
vendor: true,
}
验证方法
- 编译并推送:
adb push camera_hal_init_test /data/local/tmp/ - 执行测试:
adb shell /data/local/tmp/camera_hal_init_test - 预期输出(logcat中查看):
Camera HAL module loaded successfully:
Module name: Camera Module
Module author: Qualcomm
Module API version: 1.0
HAL API version: 1.0
Camera HAL initialization test PASSED
判定标准:程序返回0且logcat中出现上述关键信息即表示模块加载、回调设置和版本校验全部通过。若返回非0值,根据错误日志定位是模块加载失败、回调未注册还是版本不匹配。