和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、Camera 框架介绍:
二、Camera 启动流程
三、kernel 启动流程
1、set clock 设置时钟
2、set driver
3、上电相关
四、总结
1、ID读取不到,I2C不通
2、Camera 启动时间过长
3、preview 阶段耗时
4、低电流、功耗相关问题
一、Camera 框架介绍:
Camera
的框架分为Kernel
部分和hal
部分,其中kernel
部分主要有两块:
image sensor driver
,负责具体型号的sensor
的id
检测,上电,以及在preview
、capture
、初始化
、3A
等等功能设定时的寄存器配置;isp driver
,通过DMA
将sensor
数据流上传;
HAL
层部分主要有三部分组成:
imageio
,主要负责数据buffer
上传的pipe
;drv
,包含imgsensor
和isp
的hal
层控制;feature io
,包含各种3A
等性能配置;
这篇内容主要介绍开机过程中search sensor
以及上电流程等内容。
二、Camera 启动流程
1、CameraService
是在开机时启动的,启动后进行searchSensor
的操作,会search
系统有多少camera
,开机时的search
操作,只进行camera
支持数量的遍历,以及sensor ID
的读取操作,如下是hal
部分的ASTAH
绘制调用流程图,对应的接口的文件路径:
HalSensorList:
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/HalSensorList.enumList.cpp
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/HalSensorList.cpp
SeninfDrv:
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/mt6765/seninf_drv.cpp
SensorDrv:
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/imgsensor_drv.cpp
(1) 这里先看enumerateSensor_Locked
完成的工作,直接看代码:
MUINT HalSensorList::searchSensors()
{
Mutex::Autolock _l(mEnumSensorMutex);
MY_LOGD("searchSensors");
return enumerateSensor_Locked();
}
MUINT HalSensorList::enumerateSensor_Locked()
{
SensorDrv *const pSensorDrv = SensorDrv::get();
SeninfDrv *const pSeninfDrv = SeninfDrv::createInstance();
//初始化seninf,配置ISP相关内容
pSeninfDrv->init();
//将所有的clk全部打开
pSeninfDrv->setAllMclkOnOff(ISP_DRIVING_8MA, TRUE);
pSensorDrv->init();
for (MUINT i = IMGSENSOR_SENSOR_IDX_MIN_NUM; i <= max_index_of_camera; i++) {
if((ret = pSensorDrv->searchSensor((IMGSENSOR_SENSOR_IDX)i)) == SENSOR_NO_ERROR){
//query sensorinfo
queryS