
和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、概述
MTK camera主要的内容在hal层,现在有hal1/hal3,当下主流的使用的是hal3,驱动主要负责sensor电源的控制以及sensor相关寄存器的操作,MTK采用设备和驱动分离的思想,抽象出imgsensor.c来控制sensor的上下电以及sensor具体的操作,结构图如下:

程序员Android转于网络
二、sensor driver介绍
Sensor driver对上响应需求,对下控制sensor硬件行为,处理器通过I2C接口来控制sensor的大部分行为,sensor输出的数据传输到TG、ISP等模块处理后,ISP将数据保存到内存中之后,才可以dump出sensor的数据,才能看到sensor的第一帧画面。这节主要介绍sensor driver的代码。
1、sensor driver函数结构体:
(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或者

最低0.47元/天 解锁文章
1695

被折叠的 条评论
为什么被折叠?



