MTK CAMERA介绍

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 */

   &

你可能感兴趣的:(Camera,android,c语言,c++,智能手机)