MTK CAMERA主要内容在hal层和kernel driver。驱动主要负责sensor电源的控制和相关寄存器控制。
kernel driver中适配了imgsensor.c来控制sensor的上下电以及对sensor具体的操作。
其中分为 imgsensor_hw.c负责powercontrol部分 以及对应的 xxxmipiraw_sensor.c是sensor driver部分sensor参数操作
sensor driver主要包括是响应上层需求和对sensor硬件行为的控制,通过I2C接口来控制。
(sensor的输出数据传输到TG,ISP等模块处理后,ISP将数据保存到内存中,才可以dump出sensor数据,就能看到sensor的画面了)
xxxmipiraw_sensor.h中几个重要的结构体
一丶
struct imgsensor_mode_struct {
kal_uint32 pclk; /* record different mode's pclk */
kal_uint32 linelength; /* record different mode's linelength */
kal_uint32 framelength; /* record different mode's framelength */
kal_uint8 startx; /* record different mode's startx of grabwindow */
kal_uint8 starty; /* record different mode's startx of grabwindow */
... ...
};
帧率调整:由于pclk = linelength * framelength * framerate * 10
sensor的 linelength是固定的,对应模式的 pclk也是不可调的。所以软件调整帧率,就是修改 framelength
static void set_max_framerate(UINT16 framerate, kal_bool min_framelength_en)
{
/* kal_int16 dummy_line; */
kal_uint32 frame_length = imgsensor.frame_length;
/* unsigned long flags; */
pr_debug("framerate = %d, min framelength should enable = %d\n",
framerate, min_framelength_en);
frame_length = imgsensor.pclk / framerate * 10 / imgsensor.line_length; // pclk与 framerate 对应关系
spin_lock(&imgsensor_drv_lock);
imgsensor.frame_length = (frame_length > imgsensor.min_frame_length)
? frame_length : imgsensor.min_frame_length;
imgsensor.dummy_line =
imgsensor.frame_length - imgsensor.min_frame_length;
if (imgsensor.frame_length > imgsensor_info.max_frame_length) {
imgsensor.frame_length = imgsensor_info.max_frame_length;
imgsensor.dummy_line =
imgsensor.frame_length - imgsensor.min_frame_length;
}
if (min_framelength_en)
imgsensor.min_frame_length = imgsensor.frame_length;
spin_unlock(&imgsensor_drv_lock);
set_dummy(); // 设置当前帧率
}
static void set_dummy(void)
{
#if 1
pr_debug("dummyline = %d, dummypixels = %d\n",
imgsensor.dummy_line, imgsensor.dummy_pixel);
/* write_cmos_sensor(0x0104, 0x01); */
/* write_cmos_sensor_twobyte(0x6028,0x4000); */
/* write_cmos_sensor_twobyte(0x602A,0xC340 ); */
write_cmos_sensor_twobyte(0x0340, imgsensor.frame_length); //
/* write_cmos_sensor_twobyte(0x602A,0xC342 ); */
write_cmos_sensor_twobyte(0x0342, imgsensor.line_length);
/* write_cmos_sensor(0x0104, 0x00); */
#endif
}
二丶 imgsensor_struct记录sensor info变量的结构体,保存sensor的动态数据。
struct imgsensor_struct {
kal_uint8 mirror; /* mirrorflip information */
kal_uint8 sensor_mode; /* record IMGSENSOR_MODE enum value */
kal_uint32 shutter; /* current shutter */
kal_uint16 gain; /* current gain */
kal_uint32 pclk; /* current pclk */
kal_uint32 frame_length; /* current framelength */
kal_uint32 line_length; /* current linelength */
&