高通CamX分析 ---02

文章目录

1.

路径:vendor/qcom/proprietary/camx/src/core/
文件:camxpipeline.cpp

CamxResult Pipeline::FinalizePipeline(FinalizeInitializationData* pFinalizeInitializationData)
{
    CamxResult                    result              = CamxResultSuccess;
    const ImageSensorModuleData*  pSensorModuleData;
	
	/* 此处省略多行代码 */

    if (CamxResultSuccess == result)
    {
        for (UINT i = 0; i < m_nodeCount; i++)
        {
            result = m_ppNodes[i]->FinalizeInitialization(pFinalizeInitializationData);

            if (CamxResultSuccess != result)
            {
                CAMX_ASSERT_ALWAYS_MESSAGE("Failed to finalize init of node: %d", i);
                break;
            }
        }
    }
}

2.

路径: vendor/qcom/proprietary/camx/src/core/
文件: camxnode.cpp

CamxResult Node::FinalizeInitialization(FinalizeInitializationData* pFinalizeInitializationData)
{
    CAMX_TRACE_SYNC_BEGIN_F(CamxLogGroupCore, "Node::%s FinalizeInitialization", NodeIdentifierString());
    CamxResult result = CamxResultSuccess;
	/* 此处省略多行代码 */
    if (CamxResultSuccess == result)
    {
        result = ProcessingNodeFinalizeInitialization(pFinalizeInitializationData);
    }
}

3.

路径:vendor/qcom/proprietary/camx/src/swl/sensor/
文件:camxsensornode.cpp

CamxResult SensorNode::ProcessingNodeFinalizeInitialization(
    FinalizeInitializationData* pFinalizeInitializationData)
{
    CamxResult              result           = CamxResultEFailed;
    CSLCSIPHYCapability     CSIPHYCapability = {0};
    CSLFlashQueryCapability flashCapability  = {0};
    CSLActuatorCapability   actuatorCap      = {0};
    CSLOISCapability        oisCap           = {0};
    ResolutionData*         pResolutionData  = NULL;
	/* 此处省略多行代码 */
    if ((CamxResultSuccess == result) && (InvalidJobHandle == m_hJobFamilyHandle))
    {
        const CHAR* pSensorName = m_pSensorModuleData->GetSensorDataObject()->GetSensorName();
        result = m_pThreadManager->RegisterJobFamily(SensorThreadJobCallback, /* 线程回调函数 */
                                                     pSensorName,
                                                     NULL,
                                                     JobPriority::High,
                                                     TRUE,
                                                     &m_hJobFamilyHandle);
    }
    if ((CamxResultSuccess == result) && (InvalidJobHandle == m_hJobFamilySubModuleOISHandle))
    {
        CHAR OISJobName[256];
        OsUtils::SNPrintF(OISJobName, sizeof(OISJobName), "%s_%s",
                          m_pSensorModuleData->GetSensorDataObject()->GetSensorName(), "OIS");
        result = m_pThreadManager->RegisterJobFamily(SensorThreadJobCallback,
                                                     OISJobName,
                                                     NULL,
                                                     JobPriority::High,
                                                     TRUE,
                                                     &m_hJobFamilySubModuleOISHandle);
    }
    /* 此处省略多行代码 */
    SensorPostJob* pSensorPostJob    = CAMX_NEW SensorPostJob;
    if (NULL != pSensorPostJob)
        {
            pSensorPostJob->pSensor          = this;
            pSensorPostJob->sensorJobCommand = SensorPostJobCommand::InitializeOIS; /* 初始化OIS */
            pSensorPostJob->pData            = NULL;
            VOID* pSensorPostJobData[]       = { pSensorPostJob, NULL };
            result                           = m_pThreadManager->PostJob(m_hJobFamilySubModuleOISHandle,
                                                            NULL, &pSensorPostJobData[0], FALSE, FALSE);
        }
     
     SensorPostJob* pSensorPostJob    = CAMX_NEW SensorPostJob;
    // Check pSensorPostJob before using it.
    if (NULL != pSensorPostJob) {
            pSensorPostJob->pSensor          = this;
            pSensorPostJob->sensorJobCommand = SensorPostJobCommand::InitializeSensor; /* 初始化sensor */
            pSensorPostJob->pData            = NULL;
            VOID* pSensorPostJobData[]       = { pSensorPostJob, NULL };
            result                           = m_pThreadManager->PostJob(m_hJobFamilyHandle,
                                                                         NULL,
                                                                         &pSensorPostJobData[0],
                                                                         FALSE,
                                                                         FALSE);
       } else {
            CAMX_LOG_ERROR(CamxLogGroupSensor, "Out of memory SensorPostJob create failed");
            result = CamxResultENoMemory;
       }
    }
   
    SensorPostJob* pSensorPostJobCreateSubModules = CAMX_NEW SensorPostJob;
     if (NULL != pSensorPostJobCreateSubModules) {
            pSensorPostJobCreateSubModules->pSensor          = this;
            /* 创建子模块 */
            pSensorPostJobCreateSubModules->sensorJobCommand = SensorPostJobCommand::SubModulesCreate;
            pSensorPostJobCreateSubModules->pData            = NULL;
            VOID* pSubModuleCreateData[]                     = { pSensorPostJobCreateSubModules, NULL };
            result               = m_pThreadManager->PostJob(m_hJobFamilyHandle, NULL,
            												&pSubModuleCreateData[0],  FALSE,  FALSE);
      }
  return result;
}

回调sensor线程工作接口
路径:vendor/qcom/proprietary/camx/src/swl/sensor/
文件:camxsensornode.cpp

VOID* SensorNode::SensorThreadJobCallback(
    VOID* pData)
{
    CamxResult  result            = CamxResultEFailed;
    SensorPostJob* pSensorPostJob = reinterpret_cast<SensorPostJob*>(pData);

    if ((NULL != pSensorPostJob) && (NULL != pSensorPostJob->pSensor))
    {
        SensorNode* pSensorNode          = static_cast<SensorNode*>(pSensorPostJob->pSensor);
        SensorPostJobCommand condition   = pSensorPostJob->sensorJobCommand;

        switch (condition)
        {
            case SensorPostJobCommand::InitializeSensor: { /* func() */ break; }
            case SensorPostJobCommand::SubModulesCreate:
            {
				 result = pSensorNode->CreateSensorSubmodules(); /* 创建子模块,详细描述见下面 */
			}
            case SensorPostJobCommand::ConfigureSensor:  { /* func() */ break; }
            case SensorPostJobCommand::InitializeOIS:  { /* func() */ break; }
            case SensorPostJobCommand::ReadRequest:  { /* func() */ break; }
         }
     }
     return NULL;
}

/* 创建子模块 */
CamxResult SensorNode::CreateSensorSubmodules()
{
    CamxResult      result = CamxResultSuccess;

    CAMX_ENTRYEXIT_SCOPE(CamxLogGroupSensor, SCOPEEventSubModuleAcquire);

    if (SensorConfigurationStatus::SensorInitializationComplete == m_sensorConfigStatus) {
        m_sensorConfigStatus = SensorConfigurationStatus::SensorSubModuleCreateInProgress;
        result = CreateSubModules();
        if ((CamxResultSuccess == result) && (NULL != m_pSensorModuleData->GetActuatorDataObject())) {
            result = CreateActuatorResources(); /* 创建AF资源 */
        }

        const StaticSettings* pStaticSettings = GetStaticSettings();
        CAMX_ASSERT(pStaticSettings != NULL);
        if ((CamxResultSuccess == result) && (FALSE == pStaticSettings->enableOISOptimization) &&
            							(NULL != m_pSensorModuleData->GetOisDataObject())) {
            // OIS Optimization is disabled, OIS needs to be created serially now
            result = CreateOISSubmodule(); /* 创建OIS资源 */
        }

        if ((CamxResultSuccess == result) && (FALSE == pStaticSettings->disableFlash) &&
           								 (NULL != m_pSensorModuleData->GetFlashDataObject())) {
            result = CreateFlashResources(); /* 创建flash资源 */
        }

        if (CamxResultSuccess == result) {
            const CSIInformation*   pCSIInfo        = m_pSensorModuleData->GetCSIInfo();
            CSLSensorCSIPHYInfo     cmdCSIPHYConfig = {0};
            if (NULL != pCSIInfo) {
                GetSensorDataObject()->CreateCSIPHYConfig(&cmdCSIPHYConfig,
                				pCSIInfo->laneAssign, pCSIInfo->isComboMode, m_currentResolutionIndex);
                cmdCSIPHYConfig.secureMode = static_cast<UINT8>(IsSecureMode());
                result                     = m_pCSIPHY->Configure(GetCSLSession(), &cmdCSIPHYConfig);
                if (CamxResultSuccess != result) {
                    CAMX_LOG_ERROR(CamxLogGroupSensor, "CSI Configuration failed");
                }
            }
        }

        if (CamxResultSuccess == result) {
            PublishLensInformation(); /* 上报镜头信息 */
            PublishCameraModuleInformation(); /* 上报camera模块信息 */
            PublishISO100GainInformation();

            m_sensorConfigStatus = SensorConfigurationStatus::SensorSubModuleCreateComplete;
            CAMX_LOG_INFO(CamxLogGroupSensor, "Sensor Submodule creation successful");
        } else {
            m_sensorConfigStatus = SensorConfigurationStatus::SensorSubModuleCreateFailed;
            CAMX_LOG_ERROR(CamxLogGroupSensor, "Sensor Submodule creation failed");
        }
    } else  {
        result = CamxResultEFailed;
        m_sensorConfigStatus = SensorConfigurationStatus::SensorSubModuleCreateFailed;
        CAMX_LOG_ERROR(CamxLogGroupSensor, "Creating sensor submodules failed due to failed sensor configuration");
    }
    return result;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值