一、概述:
MTK camera主要的内容在hal层,现在有hal1/hal3,当下主流的使用的是hal3,驱动主要负责sensor
电源的控制以及sensor相关寄存器的操作,MTK采用设备和驱动分离的思想,抽象出imgsensor.c来控制
sensor的上下电以及sensor具体的操作,结构图如下:
二、sensorDriver介绍:
Sensordriver的对上响应需求,对下控制sensor硬件行为,处理器通过I2C 接口来控制sensor的
大部分行为,sensor输出的数据传输到TG、ISP等模块处理后,ISP将数据保存到内存中之后,才可以
dump出sensor的数据,才能看到sensor的第一帧画面。这节主要介绍sensordriver的代码。
1、sensorDriver函数结构体:
(1)imgsensor_mode_struct不同模式特征的结构体:
这个结构体描叙了各个模式下的pclk/linelength/framelength 等:
struct imgsensor_mode_struct {
kal_uint32 pclk;
kal_uint32 linelength;
kal_uint32 framelength;
kal_uint8 startx;
kal_uint8 starty;
kal_uint16 grabwindow_width;
kal_uint16 grabwindow_height;
/* MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */
kal_uint8 mipi_data_lp2hs_settle_dc;
/* following for GetDefaultFramerateByScenario() */
kal_uint16 max_framerate;
kal_uint32 mipi_pixel_rate;
};
对应的描叙信息如下:pclk ≈ linelength * frame_length * framerate:
static kal_uint32 set_max_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate)
{
kal_uint32 frame_length;
switch (scenario_id) {
case MSDK_SCENARIO_ID_CAMERA_PREVIEW:
frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength;//计算frame_length
spin_lock(&imgsensor_drv_lock);
imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ?
(frame_length - imgsensor_info.pre.framelength) : 0;
imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line;
imgsensor.min_frame_length = imgsensor.frame_length;
spin_unlock(&imgsensor_drv_lock);
set_dummy(); //更新新的frame_length
break;
}
sensor的linelength是固定的,每个模式的pclk也是不可调的,所以要调整帧率framerate,只能调整frame_length。
set_dummy使得当前帧率立刻变化为设置的帧率,如果pclk或者linelength与对应sensor setting的实际值不一致,
设置的帧率和响应的帧率会有一个偏差,画面可能出现水波纹:
(2)struct imgsensor_info_struct描叙se