MTK平台开机初始化时 camera驱动流程|MTK camera调试常见几十种问题处理方法

转载:https://www.jianshu.com/p/75ab1d82bbd3

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

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

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

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

MTK平台开机初始化时 camera驱动流程|MTK camera调试常见几十种问题处理方法_第1张图片

解析下图片的流程:

Hal层在开机初始化调用文件  Imgsensor_drv.cpp

(MTK8163\vendor\mediatek\proprietary\platform\MT8163\hardware\mtkcam\hal\sensor)

中的impSearchSensor(pfExIdChk pExIdChkCbf) 函数,这个函数执行4个功能:

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

2).用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,挂街上具体的底层驱动接口。

3).用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

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

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

 

2.开应用时,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 camera调试常见几十种问题处理方法

http://bbs.16rd.com/forum.php?mod=viewthread&tid=52085&fromuid=28165



 


 

你可能感兴趣的:(驱动管理)