MTK平台开机初始化时 camera驱动流程
下面开机过程中CAMERA动作和打开应用时camera动作2个方面来解析camera驱动:
1.开机时,camera完成了sensor框架的初始化,id检测,以及上下电操作;
开机初始化软件上实现cpu识别camera sensor 的流程图如下图片:
解析下图片的流程:
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 id4).分别对前后已经配对了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寄存器进行初始化,从而启动相应的操作。
不错,点个赞
支持美女原创。
不错,谢谢分享!
感谢,最近也在学习camera
谢谢,讲的很好
小编,请问一下,我使用串口怎么抓取不到impSearchSensor的log信息
mark
点赞,学习了
先Mark:lol:lol
路过看看