Camera驱动流程总结
范军君
junjun.fan@
目录
1, Camera架构及流程简析
2, 初始化过程cameraid检测
3, Camera上电流程
4, Camera打开流程
Camera架构及流程简析
MTK平台camera架构:
Kernel 部分主要有两块:一块是imagesensor驱动,负责具体型号的sensor的id检测,上
电,以及在preview,capture,初始化,3A等等功能设定时的寄存器配置。另一块是ispdriver,
通过DMA将sensor数据流上传。
本篇主要介绍imagesensor驱动的流程。
HAL层这边主要 3块,一块是imageio,主要是数据buffer上传的pipe。一块是drv,包
含imgsensor和isp 的hal层控制。最后是featureio,包含各种3A等性能配置。
本篇对HAL涉入不深,只在分析开机过程的id检测时会分析hal层的控制,属于第二块。
流程简析:
主要发生在两个时间点:开机过程中camera 的动作以及打开应用时camera 的动作。
开机时,camera完成了sensor框架的初始化,id检测,以及上下电操作。
打开应用时,camera会有上电,完成寄存器的初始配置,向上层传送基本参数及配置信息,
以及preview和capture模式循环。
初始化过程cameraid检测
代码分析:
=>alps/mediatek/custom/common/kernel/imgsensor/kd_sensorlist.c
module_init 说明这段code在kernel初始化,也就是手机开机时运行。
在模块初始化函数中,注册一个i2cdevice,同时注册了一个platformdriver
注意drivername, 匹配platform device 需要名字一致。Platform 总线为虚拟总线,注册
platformdriver主要目的是隔离上下层,增强代码的可移植性。
alps/mediatek/platform/mt6582/kernel/core/mt_dev.c
mtk平台用到的platformdevicej基本都在这个文件中注册,这样device和driver就能匹配上
了。
在platformprobe 中注册i2cdriver 和之前的i2cdevice 匹配
配置 i2cclock ,注册一个字符设备。一般驱动中注册字符设备,多是利用字符设备的fops
与上层交互,特别是ioctl.
这些就是具体的fops
open只是用来计数目前打开camera 的数量,所以主要的交互功能要靠ioctl来完成
这个函数很重要,沟通上下层,提供接口。 这边的Command用幻字定义,可以保持cmd
的唯一性,并具备可读性。Command可带不定长参数。
下面是switchcase,通过ioctl传下来的参数选择调用分支
支持的command汇总,包括camera开机过程中上电,id检测以及imagesensor 的参数获取
KDIMGSENSORIOC_X_SET_DRIVER 和 KDIMGSENSORIOC_T_CHECK_IS_ALIVE 这
两个func在开机初始化检测id会被hal层调用。
=>mediatek/platform/mt6582/hardware/camera/core/drv/imgsensor/imgsensor_drv.cpp
impSearchSensor 在开机过程中被调用,用于检测id,匹配main/subimagesensor
GetSensooInitFuncList 这个函数主要为了获得下表
包含了id,name和一些方法的调用,因为在driver层有相似的架构,放在后面分析具体过程。
=>impSearchSensor
Hal层开始探测sensor, 应为有两颗sensor,外层循环两次
内层循环根据上面的sensor列表来,最大支持兼容16颗sensor,hal层特效,如果没有整合
特定imagesensor 的hal层代码,这边会直接退出。
getCameraDefault 调用很重要,hal层camera 的所有特效参数,包括3A,shading都在这边设
定。getCameraDefault 通过之前的Sensorlist来连接特定imagesensor的具体实现。下表是2675