MTK平台点亮sensor以及mtk开机初始化

  • MTK点亮sensor

    • Probe:上电–>matach id–>下电
    • Driver:Kernel部分和Hal部分
    • dtsi:主要配置GPI的上电逻辑,把camera的上电管脚与平台管脚相关联。
    • custom:tuning和imagesensor metadata
  • 添加一个sensor

  • kenrel层

    • 把厂商提供的包含前摄像头驱动文件夹 gc2385_mipi_raw 和后摄像头驱动文件夹 gc5035cmipi_raw 拷贝到目录
      ./kernel-4.4/drivers/misc/mediatek/imgsensor/src/mt6739/ 下

      在这里插入图片描述

    • 这两个文件夹里存放着厂商写好的前后摄像头驱动代码。

  • hal层

    • lens文件路径:./vendor/mediatek/proprietary/custom/mt6739/hal/lens/k39tv1_bsp_1g/dw9714af

      在这里插入图片描述

    • imgsensor文件路径:./vendor/mediatek/proprietary/custom/mt6739/hal/imgsensor/gc2385_mipi_raw

      在这里插入图片描述

    • flashlight文件路径:./vendor/mediatek/proprietary/custom/mt6739/hal/flashlight/k39tv1_bsp_1g

      在这里插入图片描述

    • TSF文件路径:./vendor/mediatek/proprietary/custom/mt6739/hal/imgsensor/

    • 添加文件

    • gc2385_mipi_raw/camera_tsf_para_gc2385mipiraw.h

    • gc2385_mipi_raw/camera_tsf_data_gc2385mipiraw.h

  • 修改ProjectConfig.mk配置文件

    • 文件路径:./device/mediatek/k39tv1_bsp_1g/ProjectConfig.mk 修改与imgsensor相关的配置

      在这里插入图片描述

      修改与lens相关的配置信息
      在这里插入图片描述

      修改flashlight相关配置信息
      支持flashlight则对应的CUSTOM_xxx设置为constant_flashlight,不支持设置为 dummy_flashlight。
      在这里插入图片描述

  • 修改defconfig配置文件

    • 文件路径

         ./kernel-4.4/arch/arm/configs/k39tv1_bsp_1g_defconfig
         ./kernel-4.4/arch/arm/configs/k39tv1_bsp_1g_debug_defconfig
         CONFIG_CUSTOM_KERNEL_IMGSENSOR="gc5035cmipi_raw sp2509_mipi_raw gc2385_mipi_raw"
      
  • 修改内核驱动代码

    • 添加新的camera sensor ID定义

    • 文件路径:./device/mediatek/common/kernel-headers/kd_imgsensor.h

      在这里插入图片描述

      上面定义的 sensor ID 来自于对应的 datasheet 。
      文件路径:./kernel-4.4/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h
      在这里插入图片描述

      添加新的Camera sensor初始化函数声明

    • 文件路径:./kernel-4.4/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h
      在这里插入图片描述

    • 文件路径:./kernel-4.4/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.c
      在这里插入图片描述

         第一个参数对应 Camera Snesor ID
         第二个参数对应 Camera Sensor name ;
         第三个参数对应 Camera Sensor init Function
      
  • 修改hal层驱动代码

    • 在hal层的sensor列表添加新的sensor

    • 文件路径:./vendor/mediatek/proprietary/custom/mt6739/hal/imgsensor_src/sensorlist.cpp

      在这里插入图片描述

    • 注意::sensorlist.cpp 中的 SensorList[] 与 kd_sensorlist.h 中的kdSensorList[].sensor 的顺序必须一致,否则 user space 和 kernel space 在通过 ioctl 传递命令 id 时会对应错误。

  • 修改内核代码中关于上电时序的代码

    • 文件路径:./kernel-4.4/drivers/misc/mediateck/imgsensor/src/mt6739/camera_hw/imgsensor_cfg_table.c
      在这里插入图片描述
      在这里插入图片描述

      第一个参数对应 PowerType
      第二个参数对应 Voltage
      第三个参数对应 Delay Time in ms

  • DVDD/DOVDD/AVDD/AFVDD 的电压支持情况可以参考 specific pmic datasheet 进行设置。
    在这里插入图片描述

  • 设备树中的配置

    • dws工具修改compatible

    • 设备树里的 compatible 通过 dws 工具匹配出来的,通过dws 工具修改,生成文件 k39tv1_bsp_1g.dws 。

    • dws 工具路径:./vendor/mediatek/proprietary/scripts/dct/DrvGen.exe

      在这里插入图片描述

    • dws 文件路径: ./kernel-4.4/drivers/misc/mediatek/dws/mt6739/k39tv1_bsp_1g.dws 在这里插入图片描述

  • 通过 DrvGen.exe 这个工具可以修改 k39tv1_bsp_1g.dws 文件中各参数的配置。

  • 主摄像头 CAMERA_MAIN 的I2C通讯地址是 0x37 , CAMERA_SUB 的 I2C 通讯地址是 0x3C ,对应生成的文件是 cust.dtsi。

  • sust.dtsi中对camera的配置

    • 文件路径:./out/target/product/k39tv1_bsp_1g/obj/KERNEL_OBJ/arch/arm/boot/dts/k39tv1_bsp_1g/cust.dtsi
      在这里插入图片描述

    • 成功调用到后摄像头对应的 imgsensor_i2c_probe_1() 和前摄像头 imgsensor_i2c_probe_2()
      函数需要分别匹配上 cust.dtsi 文件中的 compatible 节点 “mediatek,camera_main” 和 “mediatek,camera_sub”

  • 设置上下电用到的LDO GPIO

    • 因为mt6739使用的是PMIC的方式进行供电,所以不需要配置LDO的供电方式。

    • 文件路径:./kernel-4.4/arch/arm/boot/dts/k39tv1_bsp_1g.dts 在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

  • 上面代码可以发现有两个 kd_camera_hw1 ,这里遵循一种规则:

    • 如果第一个 kd_camera_hw1 中定义的属性在第二个 kd_camera_hw1 中也有定义则使用第二个 kd_camera_hw1 中定义的属性;

    • 如果第一个 kd_camera_hw1 中定义的属性在第二个 kd_camera_hw1 中没有定义,则使用第一个
      kd_camera_hw1 中定义的属性;

  • 确定camera sensor使用的供电方式

    • AVDD 引脚设置为 IMGSENSOR_HW_ID_REGULATOR 说明使用的是 PMIC 的方式供电。

    • 文件路径:./kernel-4.4/dirvers/misc/mediateck/imgsensor/src/mt6739/camera_hw/imgsensor_cfg_table.c

在这里插入图片描述

    mipi上下电时序
        文件路径:**./kernel-4.4/drivers/misc/mediatek/imgsensor/src/mt6739/camera_hw/imgsensor_cfg_table.c

在这里插入图片描述

  • 开机初始化

    • mtk的驱动多是以模块加载的方式(module_init();module_exit();)加载到内核中去的;正因为如此开机初始化加载内核的时候。就会加载这些驱动;

    • 开机过程中camera动作和打开应用时camera动作2个方面来解析camera驱动:

    • 开机时,camera完成了sensor框架的初始化,id检测,以及上下电操作;

    • 开机初始化软件上实现cpu识别camera sensor 的流程图如下图片:

    • 图片流程如下:
      在这里插入图片描述

  • Hal层在开机初始化调用文件 Imgsensor_drv.cpp(MTK8163\vendor\mediatek\proprietary\platform\MT8163\hardware\mtkcam\hal\sensor)中的impSearchSensor(pfExIdChk pExIdChkCbf) 函数,这个函数执行4个功能:

    • 用GetSensorInitFuncList(&m_pstSensorInitFunc)函数获取目前所有的camera sensor 列表,这些前后camera都在projectconfig.mk 已经设置。

    • 用KDIMGSENSORIOC_X_SET_DRIVER向Kd_sensorlist.c mtk8163\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt8163)中的CAMERA_HW_Ioctl传值,通过case分支最终调用kdSetDriver函数,根据在projectconfig.mk文件里面的main sub camera的配置,找到相应的前后camera具体的驱动文件,即对于正在遍历的这颗sensor,挂街上具体的底层驱动接口。

    • 用KDIMGSENSORIOC_T_CHECK_IS_ALIVE向Kd_sensorlist.c中的CAMERA_HW_Ioctl(即前面讲到的上层操作底层的接口)传值,通过case分支最终调用adopt_CAMERA_HW_CheckIsAlive函数,在这个函数里开始给前面找到的所有camera上电,并通过向具体驱动里面的ioctrl函数传递SENSOR_FEATURE_CHECK_SENSOR_ID参数,最终通过case分支调用对应的函数通过I2c读取并核对是否为该sensor的
      id,去识别具体的camera sensor id

    • 分别对前后已经配对了sensor id的camera执行m_pSubSensorInfo =m_pstSensorInitFunc.pSensorInfo;通过这个函数会调用具体驱动(这里以gc21452M 的前摄像头为例) UINT32GC2145MIPIGetInfo()函数,这个函数是获取sensor IC preview capture vedio时的帧率 丢帧 打开时候的默认窗口,数据传输的type等基本信息。

    • 通过以上几个步骤kernel内核已经识别了主板上的硬件camera IC了,并获取具体sensorIC的基本信息。

  • 开应用时,camera会有上电,完成寄存器的初始配置,向上层传送基本参数及配置信息,以及preview和capture模式循环

  • 客户端在点击对应camera图标开始进入previewcaputure vedio 应用操作时候,上层应用会启动上层的服务程序去调用Imgsensor_drv.cpp文件里面的ImgSensorDrv:pen(MINT32 sensorIdx)函数,通过函数KDIMGSENSORIOC_T_OPEN()最终调用具体驱动UINT32 GC2145MIPIOpen(void)这个open函数。

  • 这个函数主要目的:通过调用GC2145MIPI_Sensor_Init函数,对相关capturepreview
    Vidio动作的3A寄存器进行初始化,从而启动相应的操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值