概述
-
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(MTK8163vendormediatekproprietaryplatformMT8163hardwaremtkcamhalsensor)中的impSearchSensor(pfExIdChk pExIdChkCbf) 函数,这个函数执行4个功能:
-
用GetSensorInitFuncList(&m_pstSensorInitFunc)函数获取目前所有的camera sensor 列表,这些前后camera都在projectconfig.mk 已经设置。
-
用KDIMGSENSORIOC_X_SET_DRIVER向Kd_sensorlist.c mtk8163kernel-3.10driversmiscmediatekimgsensorsrcmt8163)中的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寄存器进行初始化,从而启动相应的操作。
最后
以上就是欢呼心锁为你收集整理的MTK平台点亮sensor以及mtk开机初始化的全部内容,希望文章能够帮你解决MTK平台点亮sensor以及mtk开机初始化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复