android mtk6732 camera otp 加载流程

2023-11-07

  

在android的hal层获取属性节点信息值:

    //====== Get Property ======
    char value[PROPERTY_VALUE_MAX] = {'\0'};   
    property_get("camcaldrv.log", value, "0");
    MINT32 dumpEnable = atoi(value);
    //====== Get Property ======

 

 

af_mgr.cpp   init() -->  readOTP() :      //lens_para_FM50AF.cpp里面有关于这个功能的开关:0,disable,1,enable

CamCalDrvBase *pCamCalDrvObj = CamCalDrvBase::createInstance();

result= pCamCalDrvObj->GetCamCalCalData(i4SensorDevID, enCamCalEnum, (void *)&GetCamCalData);

    MINT32 i4InfPos, i4MacroPos;
    if (GetCamCalData.Single2A.S2aBitEn & 0x1)//判断是否使能此OTP
    {
        i4InfPos = GetCamCalData.Single2A.S2aAf[0];
        if (GetCamCalData.Single2A.S2aBitEn & 0x2)//判断是否使能此OTP
        {
            i4MacroPos = GetCamCalData.Single2A.S2aAf[1];
            if (i4MacroPos < i4InfPos)
            {
                MY_LOG("OTP abnormal return [Inf]%d [Macro]%d", i4InfPos, i4MacroPos);
                return S_AF_OK;
            }
        }
        else    i4MacroPos = 0;

        MY_LOG("OTP [Inf]%d [Macro]%d", i4InfPos, i4MacroPos);
        if (m_pIAfAlgo)
            m_pIAfAlgo->updateAFtableBoundary(i4InfPos, i4MacroPos);//传给算法那边会针对每颗模组产生新的table
    }

mtk备注:

Af otp 烧录的是infmacro两个位置,在af_mgr.cpp文件的init()函数调用readOtp(),将两个位置读取出来,传给算法那边会针对每颗模组产生新的table

m_pIAfAlgo->updataAFTableBoundary(i4InfPos,i4MacroPos);

 

   上述代码中 result= pCamCalDrvObj->GetCamCalCalData(i4SensorDevID, enCamCalEnum, (void *)&GetCamCalData);  --->

cam_cal_drv.cpp ---> class CamCalDrvBase ---> GetCamCalCalData(unsigned long i4SensorDevId,CAMERA_CAM_CAL_TYPE_ENUM a_eCamCalDataType,void *a_pCamCalData) :

    PCAM_CAL_DATA_STRUCT la_pCamCalData = (PCAM_CAL_DATA_STRUCT)a_pCamCalData;
    PCAM_CAL_DATA_STRUCT pCamcalData = &StCamCalCaldata;

m32CamCalDataValidation= GetCameraCalData(i4CurrSensorId, (MUINT32*)pCamcalData); 

memcpy((UINT8*)la_pCamCalData, (UINT8*)pCamcalData, sizeof(CAM_CAL_DATA_STRUCT));//最终获取到OTP数据

其中GetCameraCalData() :

    if (pstSensorInitFunc[i].getCameraCalData != NULL)//针对当前camera id ,如果sensorlist.cpp的SensorList[]某一项camera配置了GetSensorCalData()就会获取OTP数据.
    {
        result = pstSensorInitFunc[i].getCameraCalData(pGetSensorCalData);
    }

比如:

#if defined(IMX135_MIPI_RAW)
  RAW_INFO(IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW,IMX135_CAM_CALGetCalData),
#endif

camera_calibration_cam_cal.cpp  ---> UINT32 IMX135_CAM_CALGetCalData(UINT32* pGetSensorCalData)

PCAM_CAL_DATA_STRUCT pCamCalData = (PCAM_CAL_DATA_STRUCT)pGetSensorCalData;

然后会OPEN如下图片中的设备来I2C通信,读取模组的OTP数据.

需要读取的块及实现函数: 

const CALIBRATION_LAYOUT_STRUCT CalLayoutTbl[MAX_CALIBRATION_LAYOUT_NUM]=...

 

MTK 的 OTP格式:

 

其中,重点是如下两项,第一项是模组的lsc,第二项是模组的AWB,AF等校准信息:

   {0x00000001, 0x00000017, 0x00000001, DoCamCalSingleLsc}, //CAMERA_CAM_CAL_DATA_SHADING_TABLE
   {0x00000001, 0x00000007, 0x0000000E, DoCamCal2AGain}, //CAMERA_CAM_CAL_DATA_3A_GAIN

eg:

   if(0x2&AWBAFConfig){
                AF
                cam_calCfg.u4Offset = (start_addr+10);
                cam_calCfg.u4Length = 2;
                cam_calCfg.pu1Params = (u8 *)&AFInf;           
                ioctlerr= ioctl(CamcamFID, CAM_CALIOC_G_READ, &cam_calCfg); 
...    
                cam_calCfg.u4Offset = (start_addr+12);
                cam_calCfg.u4Length = 2;
                cam_calCfg.pu1Params = (u8 *)&AFMacro;           
                ioctlerr= ioctl(CamcamFID, CAM_CALIOC_G_READ, &cam_calCfg); 
...     
                pCamCalData->Single2A.S2aAf[0] = AFInf;
                pCamCalData->Single2A.S2aAf[1] = AFMacro;
            }    
MTK底层otp读写I2C设备驱动位置:

mediatek/custom/common/kernel/cam_cal/dummy_eeprom/dummy_cam_cal.c

 在cam_cal里面的设备名字要和上面打开的设备名字相一致:CAM_CAL_DRV

再就是,在i2c设备cam_cal里,要注意读写地址是一个字节还是两个字节,如果不符会导致I2C不通:

 #ifdef _SUNNY_AF_OTP_MODIFY_//for otp
    i4RetValue = i2c_master_send(g_pstI2Cclient, puReadCmd+1, 1);
    if (i4RetValue != 1)
    {
        CAM_CALDB("[CAM_CAL] I2C send read address failed!! \n");
        return -1;
    }
 #else
    i4RetValue = i2c_master_send(g_pstI2Cclient, puReadCmd, 2);
    if (i4RetValue != 2)
    {
        CAM_CALDB("[CAM_CAL] I2C send read address failed!! \n");
        return -1;
    }
 #endif

注意: 摄像头模组水平,向上,向下拍摄时code值范围是不同的,相差100code左右:

 

1#模组

向上

水平

向下

起始Code

216

148

102

终止Code

559

494

432

 

2#模组

向上

水平

向下

起始Code

175

124

68

终止Code

495

434

375

 

由于P13N07F的马达是开环马达,手机驱动端在调用舜宇的OTP数据时,需要考虑向上,水平,向下三个方向的兼容。

制程工艺上,P13N07F采用水平远近焦烧录,故手机端在调用InfinityCode值时,需要减去向下方向的位置差CodeMax,故手机端在调用MacroCode值,需要加上向上方向的位置差Code(Max)

 

从我手边的模组来看,向下方向的位置差CodeMax=100,向上方向的位置差Code(Max)=100,应该可以用.例如你手头的模组读取的OTP_Infinity=220, OTP_Macro=334,那么你可以设置Mobile_Infinity=120 Mobile_Macro=434. 特别注意需要保证驱动,Mobile_Infinity>=0, Mobile_Macro<=1023,不能越界。

 

以后,力求把思路,代码以准确兼形象的方式来进行总结.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android mtk6732 camera otp 加载流程 的相关文章

随机推荐

  • shell脚本awk之变量传递

    一 在shell脚本中awk引用shell变量 1 双引号加单引号的形式 1 awk引用系统变量 bin bash awk BEGIN print HOSTNAME 执行结果 root node1 pangbing test sh test
  • 主板中的Win10/win8.1 WHQL支持是否要开启

    主板中的Win10 win8 1 WHQL支持是否要开启 在新式的电脑主板上会有Windows 10 8 1 WHQL支持开启的选项 这个选项的开启和关闭分别代表什么意义呢 这其实还要从UEFI和Legacy两种不同BIOS的说起 Lega
  • 生命在于折腾——MacOS(Inter)渗透测试环境搭建

    一 前景提要 之前使用的是2022款M2芯片的MacBook Air 13寸 不得不说 是真的续航好 轻薄 刚开始我了解到M芯片的底层是ARM架构 我觉得可以接受 虚拟机用的不多 但在后续的使用过程中 发现卡脖子就是卡脖子 随后换了联想R9
  • Linux内核的全局变量

    全局变量 srctree if KBUILD SRC KBUILD SRC CURDIR objtree CURDIR src srctree obj objtree VPATH srctree if KBUILD EXTMOD KBUIL
  • Blender人物骨骼绑定

    Blender人物骨骼绑定 1 建立骨骼父子关系 某些物体依附到其他物体上并成为它的子物体 可由骨骼按E键直接分裂出子骨骼 2 将骨骼建立和三维模型的父子关系 3 设置反向运动学 正常的正向运动学是FK 也就是父骨骼带动子骨骼 而如果想要实
  • mysql中的group by 和 having使用

    mysql中的group by 和 having 使用 理论 sql中的group by 用法解析 Group By语句从英文的字面意义上理解就是 根据 by 一定的规则进行分组 Group 它的作用是通过一定的规则将一个数据集划分成若干个
  • SDL 使用 framebuffer

    SDL 窗口系统 基于X11或WayLand协议 OpenGL 与硬件无关 通过发命令给GPU完成绘制工作 EGL 与硬件相关 是窗口系统 SDL 和OpenGL媒介 SDL Simple DirectMedia Layer 是一套开放源代
  • SpringBoot统一接口返回

    文章目录 前言 思路 1 定义标识 可以定义一个注解作为标识 2 对Controller或者method打上标识 3 请求时判断是否存在该标识 可以利用拦截器 4 对结果重新写入 前言 前后分离时 我们要定义好统一的接口返回格式 eg co
  • PCL点云处理之泊松曲面重建(一百六十一)

    PCL点云处理之泊松曲面重建 一百六十一 一 算法介绍 二 算法实现 1 代码 2 效果 一 算法介绍 泊松曲面重建基于泊松方程 根据泊松方程使用矩阵迭代求出近似解 采用移动立方体算法提取等值面 对所测数据点集重构出被测物体的模型 泊松方程
  • 【C语言基础】标准库函数strcat的使用

    文章目录 C语言基础 标准库函数strcat的使用 一 功能解释 二 函数原型 三 使用示例 1 使用字符数组作为第一个参数 2 使用指向字符数组的指针作为第一个参数 3 使用字符串常量作为第二个参数 4 使用字符数组作为第二个参数 5 使
  • PyTorch学习笔记(20) ——激活函数

    0 前言 本博客内容翻译自纽约大学数据科学中心在2020发布的 Deep Learning 课程的Activation Functions and Loss Functions部分 废话不多说 下面直接开始吧 1 激活函数 本内容将回顾一些
  • js删除数组中指定元素

    js删除数组中某一项或几项的几种方法 一 删除第一个元素 1 shift 方法用于把数组的第一个元素从其中删除 并返回第一个元素的值 注意 此方法改变数组的长度 提示 移除数组末尾的元素可以使用 pop 方法 let arr 1 2 3 4
  • LEARN C++(Methods)

    Getting the most out of these tutorials As you go through these tutorials we recommend a number of practices to maximize
  • CSS 之实现它们它们和它们

    一 CSS画图形 1 用CSS画三角形 首先 需要把元素的宽度 高度设为0 然后设置边框样式
  • mkdocs 使用说明

    mkdocs 使用说明 安装 pip3 install mkdocs 1 4 2 创建项目 mkdocs new my project cd my project 修改 mkdocs yml site name My Docs site u
  • C#使用Quartz.NET详细讲解

    Quartz NET是一个开源的作业调度框架 是OpenSymphony 的 Quartz API的 NET移植 它用C 写成 可用于winform和asp net应用中 它提供了巨大的灵活性而不牺牲简单性 你能够用它来为执行一个作业而创建
  • PCRE正则表达式

    PCRE正则表达式的定义 用于描述字符排列和匹配模式的一种语法规则 它主要用于字符串的模式分割 匹配 查找及替换操作 PHP中的正则函数 PHP中有两套正则函数 两者功能差不多 分别为 一套是由PCRE Perl Compatible Re
  • 黑盒测试中的等价类和边界值

    黑盒测试时基于程序规格说明书 找出程序不符合格则说明书的地方 也就是我们常说的点点点 在进行黑盒测试时 我们可以利用一下几种方法来写出测试用例 尽量用科学的方法来找出更多的缺陷 等价类划分 等价类划分是一种重要的 常用的黑盒测试方法 不需要
  • js打开新的窗口window_前端必备基础知识:window.location 详解

    作者简介 李中凯 八年多工作经验 前端负责人 擅长JavaScript Vue 掘金文章专栏 KaysonLi 的个人主页 专栏 掘金 前端开发人员对 window location对象应该不陌生 通过它不但可以获取当前页面的地址信息 还可
  • android mtk6732 camera otp 加载流程

    在android的hal层获取属性节点信息值 Get Property char value PROPERTY VALUE MAX 0 property get camcaldrv log value 0 MINT32 dumpEnable