首页 > 其他分享 >Camera Sensor接口配置

Camera Sensor接口配置

时间:2024-03-28 21:12:10浏览次数:34  
标签:Camera regSetting pRegSettingsInfo pExposureData 接口 regCount gain Sensor pRegInf

参考资料:极客笔记   以ov7251的cpp接口文件为例,编译生成so库文件

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "camxsensordriverapi.h"
// NOWHINE ENTIRE FILE

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RegisterToRealGain
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static DOUBLE RegisterToRealGain(
    UINT registerGain)
{
    DOUBLE real_gain;
    real_gain = (DOUBLE) (((DOUBLE)(registerGain))/16.0);
    return real_gain;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RealToRegisterGain
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static UINT RealToRegisterGain(
    DOUBLE realGain)
{
    UINT reg_gain = 0;
    realGain = realGain*16.0;
    reg_gain = (UINT)realGain;
    return reg_gain;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CalculateDigitalGain
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static UINT CalculateDigitalGain(
    FLOAT totalRealGain,
    FLOAT sensorRealGain)
{
    CDK_UNUSED_PARAM(totalRealGain);
    CDK_UNUSED_PARAM(sensorRealGain);
    return 1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FillExposureSettings
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CalculateExposure(                                    // 计算曝光的具体接口
    SensorExposureInfo*          pExposureInfo,            // 输出
    SensorCalculateExposureData* pCalculateExposureData)    // 平台传进来的
{
    ... ...
    pExposureInfo->analogRegisterGain   = RealToRegisterGain(pCalculateExposureData->realGain);    // 平台传进来的realGain转到寄存器的模拟gain
    pExposureInfo->analogRealGain       = static_cast<FLOAT>(RegisterToRealGain(pExposureInfo->analogRegisterGain));    // 变成register值
    pExposureInfo->digitalRegisterGain  =
        CalculateDigitalGain(pCalculateExposureData->realGain, pExposureInfo->analogRealGain);    // 平台传进来的realGain转到寄存器数字gain
    pExposureInfo->digitalRealGain      = 1.0;    // 系数
    pExposureInfo->ISPDigitalGain       =
        pCalculateExposureData->realGain /(pExposureInfo->analogRealGain * pExposureInfo->digitalRealGain);    // 还不满足,就需要ISP数字gain
    pExposureInfo->lineCount            = pCalculateExposureData->lineCount;    // 平台传入直接赋值
    ... ...
    return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FillExposureSettings
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL FillExposureSettings(                        // 具体实现代码逻辑
    RegSettingsInfo*        pRegSettingsInfo,        // 输出参数
    SensorFillExposureData* pExposureData)            // 输入参数
{
    ... ...
    for (index = 0; index < pExposureData->pRegInfo->groupHoldOnSettings.regSettingCount; index++)    // 配置holdon寄存器
    {    
        pRegSettingsInfo->regSetting[regCount].registerAddr =
            pExposureData->pRegInfo->groupHoldOnSettings.regSetting[index].registerAddr;
        pRegSettingsInfo->regSetting[regCount].registerData =
            pExposureData->pRegInfo->groupHoldOnSettings.regSetting[index].registerData;
        pRegSettingsInfo->regSetting[regCount].regAddrType  =
            pExposureData->pRegInfo->groupHoldOnSettings.regSetting[index].regAddrType;
        pRegSettingsInfo->regSetting[regCount].regDataType  =
            pExposureData->pRegInfo->groupHoldOnSettings.regSetting[index].regDataType;
        pRegSettingsInfo->regSetting[regCount].delayUs      =
            pExposureData->pRegInfo->groupHoldOnSettings.regSetting[index].delayUs;
    regCount++;    // 多少个寄存器要去写
    }

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->frameLengthLinesAddr;    // 曝光相关寄存器VTS
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->frameLengthLines & 0xFF00) >> 8;
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->frameLengthLinesAddr + 1;
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->frameLengthLines & 0xFF);
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->coarseIntgTimeAddr - 1;    // line count
    pRegSettingsInfo->regSetting[regCount].registerData  = pExposureData->lineCount >> 12;
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->coarseIntgTimeAddr;
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->lineCount >> 4) & 0xFF;
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->coarseIntgTimeAddr + 1;
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->lineCount << 4) & 0xFF;
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->globalAnalogGainAddr;    // gain配置
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->analogRegisterGain & 0xFF00) >> 8;
    regCount++;

    pRegSettingsInfo->regSetting[regCount].registerAddr  = pExposureData->pRegInfo->globalAnalogGainAddr+ 1;
    pRegSettingsInfo->regSetting[regCount].registerData  = (pExposureData->analogRegisterGain & 0xFF);
    regCount++;

    for (index = 0; index < pExposureData->pRegInfo->groupHoldOffSettings.regSettingCount; index++)    // hold off配置
    {
        pRegSettingsInfo->regSetting[regCount].registerAddr  =
            pExposureData->pRegInfo->groupHoldOffSettings.regSetting[index].registerAddr;
        pRegSettingsInfo->regSetting[regCount].registerData  =
            pExposureData->pRegInfo->groupHoldOffSettings.regSetting[index].registerData;
        pRegSettingsInfo->regSetting[regCount].regAddrType  =
            pExposureData->pRegInfo->groupHoldOffSettings.regSetting[index].regAddrType;
        pRegSettingsInfo->regSetting[regCount].regDataType=
            pExposureData->pRegInfo->groupHoldOffSettings.regSetting[index].regDataType;
        regCount++;
    }

    pRegSettingsInfo->regSettingCount = regCount;    // 总共的寄存器

    if (MAX_REG_SETTINGS <= regCount)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GetSensorLibraryAPIs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VOID GetSensorLibraryAPIs(
    SensorLibraryAPI* pSensorLibraryAPI)
{
    pSensorLibraryAPI->majorVersion          = 1;
    pSensorLibraryAPI->minorVersion          = 0;
    pSensorLibraryAPI->pCalculateExposure    = CalculateExposure;            // 主要就是实现这两个接口,计算曝光的关系
    pSensorLibraryAPI->pFillExposureSettings = FillExposureSettings;
}

#ifdef __cplusplus
}
#endif // __cplusplus

// SensorCalculateExposureData结构体,平台传入
typedef struct SensorCalculateExposureData
{
    FLOAT realGain;    // AE算法提供过来的,TOTAL gain
    UNIT lineCount;    // 曝光时间转换成linecount
    FLOAT middleRealGain; // 针对HDR sensor,普通sensor不用care
    UINT middleLinecount;
    FLOAT shortRealGain;
    UINT shortLinecount;
    UNIT32 sensorResolutionIndex;    // xml中不同的settings,平台传入的
} SensorCalculateExposureData;

// 输出函数
typedef struct SensorExposureInfo
{
    FLOAT analogRealGain;            // 模拟gain
    UINT  analogRegisterGain;        // 模拟gain对应的值
    FLOAT digitalRealGain;            // sensor数字gain
    UINT digitalRegisterGain;        // sensor数字gain对应寄存器的值
    FLOAT shortAnalogRealGain;        // HDR sensor才有
    UINT shortRegisterGain;
    FLOAT shortDigitalRealGain;
    UINT shortDigitalRegisterGain;
    FLOAT middleAnalogRealGain;
    UINT middleRegisterGain;
    FLOAT middleDigitalRealGain;
    UINT middleDigitalRegisterGain;
    FLOAT ISPDigitalGain;            // ISP数字gain,ISP只有数字gain,没有不用填
    UINT lineCount;                // 和传过来一样
    UNIT shortLinecount;
    UINT middleLinecount;
    FLOAT sensitivityCorrectionFactor;        // sensor感光度矫正因子,tunning管理
} SensorExposureInfo;

struct SensorFillExposureData    // 填充曝光数据,输入参数数据结构
{
    SensorExposureRegInfo* pRegInfo;    // sensor的曝光寄存器信息
    UINT analogRegisterGain;        // 模拟Gain寄存器值
    UINT digitalRegisterGain;        // 数字gain寄存器值
    UNIT lineCount;                // linecount
    UNIT frameLengthLines;            // VTS
    UNIT shortRegisterGain;            // HDR相关
    UNIT shortDigitalRegisterGain;
    UNIT middleRegisterGain;
    UNIT middleDigitalRegisterGain;
    UNIT shortLineCount;
    UNIT middleLineCount;
    INT32 additionalInfo[MAX_REG_CONTROL_EXT_DATA_SIZE];    // 拓展的相关
    BOOL applyShortExposure;
    BOOL applyMiddleExposure;
    FLOAT sensitivityCorrectionFactor;        // tunning填写
    UINT32 sensorResolutionIndex;            // 娜一组配置
} SensorFillExposureData;

struct RegSettingsInfo        // 输出参数
{
     UINT regSettingCount;        // 多少个寄存器
     RegSetting regSetting[MAX_REG_SETTINGS];   
} RegSettingsInfo;

 

寄存器的值和实际gain的转换关系参考:

 
LineCount = ExposureTime / Tline(行的曝光时间),而是一行要曝光多少的时间
Tline = HTS x 1/ VT_CLK
VT_CLK = VTS x HTS x FPS
Tline = 1/(VTS x FPS)

 

 

标签:Camera,regSetting,pRegSettingsInfo,pExposureData,接口,regCount,gain,Sensor,pRegInf
From: https://www.cnblogs.com/lethe1203/p/18102617

相关文章

  • Java接口应用代码示例
    1.概念在Java中接口是一个抽象的数据类型,在接口里面我们会定义类应该遵循的行为规范,并不会去具体实现,只是告诉了接了该接口的类一定要实现些什么方法。接口中可以有常量、方法和嵌套类型的声明(就是在该接口内部定义其他类型,如接口、类、枚举)。一个接口可以被多个类去实现,一......
  • Camera sensor bringup
    CameraSensorModule配置信息:CameraModuleConfiguration的信息包含在:<cameraModuleData>…</cameraModuleData>以vendor/qcom/proprietary/chi-cdk/oem/qcom/module/xxx_sunny_s5khm2_wide_module.xml 为例:各配置参数含义如下:参数名说明cameraId......
  • Python 字符串转为字典的两种常用方式(接口交互时)
    结论:在做接口时,请求、响应信息,必须要用json格式 原因:常规的字符串转为字典有两种方式,但两种方式都存在一定的问题:1、ast.literal_eval()(包含eval等类型方法)问题1:安全性,(literal_eval安全性好一些,eval不安全)问题2:需要将字符串中的 true false  null  =》 True......
  • 基于Axios封装请求---防止接口重复请求解决方案
     一、引言前端接口防止重复请求的实现方案主要基于以下几个原因:用户体验:重复发送请求可能导致页面长时间无响应或加载缓慢,从而影响用户的体验。特别是在网络不稳定或请求处理时间较长的情况下,这个问题尤为突出。服务器压力:如果前端不限制重复请求,服务器可能会接收到大量......
  • 动态判断是否需要Api接口鉴权
    一.概述问题:在使用asp.netcoreapi做业务开发时,在本地vs开发环境,部署后的测试环境,都需要先获取access_token,才能访问api接口,这样浪费了调试与测试时间。    现状:我这里是通过Apollo配置中心定义了二套配置环境,一是Dev环境:用于本地vs开发环境,部......
  • 容器一(泛型、Collection 接口)
    目录泛型Generics自定义泛型容器中使用泛型Collection接口泛型Generics        泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编......
  • 如何从其他平台复制商品上传到自己店铺?官方授权接口,一键复制爆款同款
    很多做一件代发的卖家在上新时会从其他平台选品铺货,看到某个商品卖得不错,直接复制到自己店铺去卖,可以节省测款成本。现在平台严查无货源,直接从别人店铺搬运商品属于违规违规行为,想要复制这个爆款的话,就需要从1688选择同款货源进行铺货。①添加到上传列表中勾选商品,点击“添......
  • Camera基础知识四
    MIPI-CSI2的PHY层定义了CSI传输介质的电气特性、帧格式以及时钟等,如下:DPHYLaneStates:EscapeMode跟csi无关,是DSI用的 LP切换到HS模式切换:差分信号一般100mv-300mvHS_SETTLE,这段时间,1.2V降到100-300mv需要时间稳定下来。HS_ZERO表示发送为0。一旦MIPITX发送00011101......
  • Camera基础知识三
    参考资料:极客笔记侵权联删 Camerasensor状态机:状态机:POWEROFF、hardwarestandby、software、streaming没电的时候就是poweroff状态,上电了进入hardwarestandby状态,xshutdown也就是reset,进入softwarestandby状态。PLL寄存器配置进去之后就进入streaming状态 Camera......
  • 股票行情数据API | 实时行情数据接口websocket接入方法
    今天给大家带来一个技术干货分享,如何通过接口API订阅并接入实时行情数据源报价,它的方法与步骤一、API地址及传参说明支持以下产品品类:美股、港股、A股、外汇、贵金属、商品、数字币github:https://github.com/alltick/realtime-forex-crypto-stock-tick-finance-websocket-a......