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,
}

验证方法

  1. 编译并推送:adb push camera_hal_init_test /data/local/tmp/
  2. 执行测试:adb shell /data/local/tmp/camera_hal_init_test
  3. 预期输出(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值,根据错误日志定位是模块加载失败、回调未注册还是版本不匹配。