Android Camera 流程学习记录(三)—— Camera hw_get_module() 相关逻辑

这篇博客深入探讨了Android Camera服务如何通过hw_get_module()函数调用硬件层的库函数。从CameraService的启动开始,详细分析了CameraService.cpp中的调用过程,再到硬件层的hardware.h和hardware.c,尤其是hw_get_module()的实现。接着,文章介绍了CameraModule的相关内容,包括CameraModule.cpp的构造函数和CameraModule的结构。最后,提到了高通平台相关的QCamera2Factory,解析了函数指针的指向。通过这次分析,读者可以更好地理解Android Camera框架到硬件层的交互机制。


简介

  • 这一篇笔记,我们将从 hw_get_module() 函数入手,去探究 Libraries 层是如何调用 HAL 层的库中的函数的。
  • CameraService 是在开机时就会启动的,而当它第一次启动时,就会调用一个名为 onFirstRef() 的成员函数,我们所要探究的内容就是从这里开始的。
  • NOTE:
    • 这一部分主要参考:
    • 本来想一天内应该能搞定这篇记录,结果公司这边正好有个项目要做,于是只能在闲暇时间慢慢写出来了。


hw_get_module()


1. CameraService

1.1 CameraService.cpp

  • 位置:framework/av/services/camera/libcameraservice/CameraService.cpp
  • CameraService::onFirstRef()
    • 首先调用其基类的 onFirstRef 函数。
    • 更新 notifier (这个 BatteryNotifier 好像是个单例,看类名好像和电池有关)。
    • 通过 hw_get_module 函数获取 rawModule
    • 注意 rawModulecamera_module_t 类型。
    • 利用 rawModule 创建 mModule 的实例,mModuleCameraModule 类。
    BnCameraService::onFirstRef();

    // Update battery life tracking if service is restarting
    BatteryNotifier& notifier(BatteryNotifier::getInstance());
    notifier.noteResetCamera();
    notifier.noteResetFlashlight();

    camera_module_t *rawModule;
    /*** NOTE THIS ***/
    int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
            (const hw_module_t **)&rawModule);
    if (err < 0) {
        ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
        logServiceError("Could not load camera HAL module", err);
        return;
    }

    /*** NOTE THIS ***/
    mModule = new CameraModule(rawModule);
    err = mModule->init();

2. hardware

2.1 hardware.h

  • 位置:hardware/libhardware/include/hardware/hardware.h
  • 注意两个宏定义:
/**
 * Name of the hal_module_info
 */
#define HAL_MODULE_INFO_SYM         HMI

/**
 * Name of the hal_module_info as a string
 */
#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"
  • 声明了这两个函数:
    • hw_get_module()
      • 作用是通过传入的 id 来获取模块相关的信息。
      • 成功则返回 0,出错则返回值小于 0*module == NULL
    • hw_get_module_by_class()
      • 作用是通过 class_id 获取与模块实例相关的信息。
      • 提供模块信息的库文件应该是带有这样命名规范的:
        - audio.primary.<variant>.so
        - audio.a2dp.<variant>.so
/**
 * Get the module info associated with a module by id.
 *
 * @ret
<think>好的,我现在需要处理用户关于Android Camera HAL中open函数实现和用法的问题。首先,我要回忆一下Android HAL的基本结构,特别是Camera模块的部分。根据用户提供的引用内容,HAL模块通过hw_get_module获取hw_module_t结构,然后通过其中的methods->open来打开设备,获取hw_device_t指针。 接下来,我需要确定open函数在Camera HAL中的具体作用。根据引用[2],hw_module_methods_t结构体包含open函数指针,这个函数用于与硬件建立通信。在Camera HAL中,这个open函数应该会初始化camera_device_t结构体,并设置相关的操作函数,比如preview、capture等。 用户可能想知道具体的代码实现或调用流程。例如,当CameraService调用open时,HAL层如何响应,如何填充camera_device_t的函数指针。需要参考Android源码中的实现,比如hardware/libhardware/modules/camera目录下的代码,但不同厂商的实现可能不同,所以需要说明通用流程。 另外,用户可能需要了解open函数的参数和返回值,以及如何在自定义HAL中实现它。比如,open函数通常接收hw_module_t指针、设备ID、hw_device_t指针,返回状态码。在实现时,需要分配camera_device_t结构,填充操作函数,并关联到hw_device_t。 还要注意结构体的继承关系,camera_module_t扩展了hw_module_t,而camera_device_t扩展了hw_device_t。在open函数中,可能需要将camera_device_t转换为hw_device_t来返回,同时设置close函数等。 最后,用户可能需要实际使用示例或伪代码,说明open函数的实现步骤。例如,分配设备结构、初始化函数指针、设置版本号等。同时,要提到不同厂商的具体实现可能有所差异,但必须遵循HAL的接口规范。</think>### Android Camera HAL中open函数的实现与用法 在Android Camera HAL(硬件抽象层)中,`open`函数是初始化硬件设备的关键接口,用于建立与物理硬件的通信,并返回设备操作所需的函数指针[^1][^2]。以下是其实现与用法的详细说明: --- #### 1. **open函数的作用** `open`函数定义在`hw_module_methods_t`结构体中,属于HAL模块的通用接口。其核心功能是: - 根据设备ID(如摄像头ID)初始化硬件设备。 - 填充`camera_device_t`结构体(继承自`hw_device_t`),关联具体的操作函数(如拍照、预览等)。 - 返回设备句柄供上层(如CameraService)调用。 --- #### 2. **函数原型与参数** 在Camera HAL中,`open`函数的典型定义如下: ```c int (*open
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值