【SPRD CAMERA】1 HAL层初始化流程

一、前言       

        根据我的理解以前android在启动camera service 会直接去操作hal层,这样hal层和framework就耦合在一起了。现在 Android O 中,加入了Camera Provider这一抽象层,该层作为一个独立进程存在于整个系统中,并且通过HIDL这一自定义语言成功地将Camera Hal Module从Camera Service中解耦出来。启动一个 CameraProvider 服务,作为一个独立进程 android.hardware.camera.provider@2.4-service 用来控制 camera HAL。

二、代码分析

      我们从android.hardware.camera.provider@2.4-service 这个服务来分析整个初始化流程。

      系统启动过程中,init进程通过解析init.rc 文件来启动服务。

idh.code\hardware\interfaces\camera\provider\2.4\default\android.hardware.camera.provider@2.4-service.rc

service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
    interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
    class hal
    user cameraserver
    group audio camera input drmrpc inet system
    ioprio rt 4
    capabilities SYS_NICE
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks

服务的入口时在service.cpp中。

idh.code\hardware\interfaces\camera\provider\2.4\default\service.cpp

int main()
{
    ALOGI("CameraProvider@2.4 legacy service is starting.");
    // The camera HAL may communicate to other vendor components via
    // /dev/vndbinder
    android::ProcessState::initWithDriver("/dev/vndbinder");
    status_t status;

    status = defaultLazyPassthroughServiceImplementation<ICameraProvider>("legacy/0",
                                                                              /*maxThreads*/ 6);
    return status;
}

这里采用的时直通模式,通过这个函数会去获取CameraProvider 服务并注册到hardwareservicemanage中,cameraservice启动时回去获取CameraProvider服务的远程代理。通过这个代理来调用CameraProvider中提供的接口。

        我们不详细介绍如何注册服务,我们只关系CameraProvider 的启动过程。经过一系列的调用最终调用到,HIDL_FETCH_ICameraProvider 这里会生成一个ICameraProvider 的对象,注册到

hardwareservicemanage。

idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\CameraProvider_2_4.cpp

ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
    using namespace android::hardware::camera::provider::V2_4::implementation;
    ICameraProvider* provider = nullptr;
   
    provider = getProviderImpl<LegacyCameraProviderImpl_2_4>();

    return provider;
}

template<typename IMPL>
CameraProvider<IMPL>* getProviderImpl() {
    CameraProvider<IMPL> *provider = new CameraProvider<IMPL>();

    return provider;
}

这里时生成一个CameraProvider 的对象。我们继续看CameraProvider 的类。

idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\CameraProvider_2_4.h

template<typename IMPL>
struct CameraProvider : public ICameraProvider {
    CameraProvider() : impl() {}
    ~CameraProvider() {}

    // Caller must use this method to check if CameraProvider ctor failed
    bool isInitFailed() { return impl.isInitFailed(); }

    // Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
    Return<Status> setCallback(const sp<ICameraProviderCallback>& callback) override {
        return impl.setCallback(callback);
    }

    Return<void> getVendorTags(getVendorTags_cb _hidl_cb) override {
        return impl.getVendorTags(_hidl_cb);
    }

    Return<void> getCameraIdList(getCameraIdList_cb _hidl_cb) override {
        return impl.getCameraIdList(_hidl_cb);
    }

    Return<void> isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) override {
        return impl.isSetTorchModeSupported(_hidl_cb);
    }

    Return<void> getCameraDeviceInterface_V1_x(
            const hidl_string& cameraDeviceName,
            getCameraDeviceInterface_V1_x_cb _hidl_cb) override {
        return impl.getCameraDeviceInterface_V1_x(cameraDeviceName, _hidl_cb);
    }

    Return<void> getCameraDeviceInterface_V3_x(
            const hidl_string& cameraDeviceName,
            getCameraDeviceInterface_V3_x_cb _hidl_cb) override {
        return impl.getCameraDeviceInterface_V3_x(cameraDeviceName, _hidl_cb);
    }

private:
    IMPL impl;
};

结合上一片的代码看,我们可以发现 new CameraProvider 相当于 就是实例化了 IMPL(LegacyCameraProviderImpl_2_4),远程调用的接口也是调用 LegacyCameraProviderImpl_2_4对应的接口,相当于只是一层封装。

继续跟踪这个LegacyCameraProviderImpl_2_4的构造函数

idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\LegacyCameraProviderImpl_2_4.cpp

LegacyCameraProviderImpl_2_4::LegacyCameraProviderImpl_2_4() :
    camera_module_callbacks_t({sCameraDeviceStatusChange,
                               sTorchModeStatusChange}) {
    mInitFailed = initialize();
}

1、camera_module_callbacks 

idh.code\hardware\libhardware\include\hardware\camera_common.h

typedef struct camera_module_callbacks {

    void (*camera_device_status_change)(const struct camera_module_callbacks*,
            int camera_id,
            int new_status);

    void (*torch_mode_status_change)(const struct camera_module_callbacks*,
            const char* camera_id,
            int new_status);

} camera_module_callbacks_t;
camera_module_callbacks_t({sCameraDeviceStatusChange, sTorchModeStatusChange}) 

这里知识初始化父类,赋值两个回调函数。

2、LegacyCameraProviderImpl_2_4::initialize

这个initialize时这个流程中最重要的函数下面会拆成几部分分析

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值