• 高通camera-sensor分辨率简单梳理



    记录学习高通关于sensor分辨率的相关笔记

    一、高通分辨率的配置文件

    高通将分辨率配置到对应的xml配置里面
    文件目录:

    vendor/qcom/proprietary/chi-cdk/vendor/sensor/default/xxx/xxxx_sensor.xml
    
    • 1

    内容大致如下,具体的请自己去看源码

    <sensorDriverData>
    	<slaveInfo>
    	  	  
    	slaveInfo>
    	-----------------------------------
    	<regAddrInfo>
    	  	  
    	regAddrInfo>
    	-----------------------------------
    	<resolutionInfo>
    	  	  
    	 resolutionInfo>
    	-------------------------------
    	 <exposureControlInfo>
    		  	  
    	 exposureControlInfo>
    	 -----------------
    	<streamOnSettings>
    		  	    	
    	streamOnSettings>
    	 -----------------
    	<streamOffSettings>
    		  	    	
    	streamOffSettings>
    	-------------------
    	<initSettings>
    			
    	initSettings>
    sensorDriverData>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    我们在编译的时候会把这个xml文件编译为对应的bin文件,在烧录的时候会把这个bin文件放在对应的目录下。
    在同一份代码中,我们会有很多的xml文件,也会有多个对应的.bin文件。
    xml配置文件比较难,修改的话需要联系对应的FAE,让他提供一些支持。

    二、 解析xml配置文件

    解析文件目录(该目录在编译后生成):

    vendor/qcom/proprietary/chi-cdk/ cdk/generated/g_sensor $ ls
    camxactuatordriver.cpp  camxflashdriver.cpp   camxoisdriver.cpp   camxsensorcommon.cpp  imagesensormodulesetmanager.cpp
    camxactuatordriver.h    camxflashdriver.h     camxoisdriver.h     camxsensorcommon.h    imagesensormodulesetmanager.h
    camxeepromdriver.cpp    camxmoduleconfig.cpp  camxpdafconfig.cpp  camxsensordriver.cpp
    camxeepromdriver.h      camxmoduleconfig.h    camxpdafconfig.h    camxsensordriver.h
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过这些名字可以看出来,imagesensormodulesetmanager.cpp 作为管理员进行这些管理,也是解析xml的主要工作者,参考源码可以得出大致的逻辑
    imagesensormodulesetmanager.cpp 主要是去创建多个对象,包括 EEPROMDriverData、sensorDriverData、

    flashDriverData…等等,然后通过对应的驱动去解析不同的xml,camxsensordriver.cpp去解析对应的sensor的xml, camxoisdriver.cpp解析对应的OIS的xml,camxeepromdriver.cpp去解析对应的eeprom的xml

    最后会把解析的数据存放到对应的Data数据指针里面去

    //imagesensormodulesetmanager.cpp
    CamX::SensorDriverData* ImageSensorModuleSetManager::GetModule_sensorDriverData(
     TuningMode* modeBranch,
     UINT32 modeCount)
    {
     ParameterModule* pModule = GetModule((const CHAR *)"sensorDriverData",
     modeBranch, modeCount);
    return (CamX::SensorDriverData*)(CamX::SensorDriverDataClass*)pModule;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    具体的详细的过程目前我还不清楚,所以后续需要仔细去看源码了

    在这里插入图片描述

    具体的流程图可以看这个图片,这个图已经把对应的文件说的很清楚了 里面有对应的函数和对应的文件名。
    到这里对应的sensor的分辨率就已经说完了。

    三、 xml配置文件如何生效

    当我们解析完xml文件后,其最终的目的都是去修改寄存器,让sensor达到这个要求,所以我们xml的生效是在注册函数里面去进行寄存器的设定
    详细的过程请看下图:

    在这里插入图片描述

    其实这个函数图我自己去跟了下,添加一写log后,抓取log进行跟踪,发现的确是这样的,但是也有部分函数没有看懂

    // 目录:vendor/qcom/proprietary/camx/src/core/camxhwenvironment.cpp
    HwEnvironment::InitCaps() {
        ProbeImageSensorModules(); //进入参考1
    }    
    
    //参考1
    // 目录: vendor/qcom/proprietary/camx/src/core/camxhwenvironment.cpp
    VOID HwEnvironment::ProbeImageSensorModules() {
        result = pData->Probe(&detected, &deviceIndex); ///通过这里调用到对应的函数里面 从这里进入参考2
    }
    
    //参考2
    // 目录 : vendor/qcom/proprietary/camx/src/core/camximagesensormoduledata.cpp
    CamxResult ImageSensorModuleData::Probe()
    {
         result = CmdBufferManager::Create("ImageSensorPacketManager", &packetResourceParams, &pPacketManager);
         result = CmdBufferManager::Create("ImageSensorCmdManagerSlaveInfo", &cmdResourceParams, &pCmdManagerSlaveInfo);
         result = CmdBufferManager::Create("ImageSensorCmdManagerPowerSequence", &cmdResourceParams, &pCmdManagerPowerSequence);
         // 这几个函数都能进入参考3
         result = CSLImageSensorProbe(pProbePacket->GetMemHandle(), pProbePacket->GetOffset(), &probeResult); //从这里进入参考4
         //最后调用完成后回到这里
         result = GetSensorDataObject()->LoadSensorLibrary();    //加载/vendor/lib64/camera/com.qti.sensor.*.so https://blog.csdn.net/shangbolei/article/details/106559537
    }
    
    // 参考3
    // 目录: vendor/qcom/proprietary/camx/src/core/camxcmdbuffermanager.cpp
    CamxResult CmdBufferManager::Create()
    {
        //  函数作用未知
    }
    
    //参考4 
    // 目录: vendor/qcom/proprietary/camx/src/csl/camxcsl.cpp
    CamxResult CSLImageSensorProbe({
      // 没有找到对应的函数进入参考5  
    }
    
    // 参考5 
    // 目录: vendor/qcom/proprietary/camx/src/csl/camxcslhw.cpp
    CamxResult CSLImageSensorProbeHW()
    {
        result = CSLHwInternalProbeSensorHW(hPacket, offset, &deviceIndex); //进入参考6
    }
    
    //参考6
    // 目录:vendor/qcom/proprietary/camx/src/csl/hw/camxcslhwinternalsensor.cpp
    CamxResult CSLHwInternalProbeSensorHW()
    {
                        ioctlCmd.op_code     = CAM_SENSOR_PROBE_CMD;        //下发给kernel
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    参考博客: 高通camera驱动 camx read xml 和 probe 流程

  • 相关阅读:
    互联网医院|互联网医疗模式已从概念走向实体建设阶段
    【leetcode】最多可以参加的会议数目
    [谷粒商城笔记]08、环境-linux安装docker
    SpringBoot 日志文件
    模拟算法及其优化
    10月12日
    在windows下安装配置skywalking
    SpringCloud链路追踪SkyWalking-第六章-日志采集
    Python 字符串详解
    什么是Bean的循环依赖?解决方案是什么?
  • 原文地址:https://blog.csdn.net/weixin_51178981/article/details/126347612