摄像头驱动分析之--IMX297/296

目录

摄像头简介

Pregius / Pregius S

Pregius = CCD结构 + 有源像素型CMOS + 全局快门

Pregius S = Pregius + 背照结构 + 堆栈式结构

初始化代码

IMX296相关的代码段

控制结构体分析


摄像头简介

  • 同属3.4系列
  • 同属嵌入式应用方向,MIPI接口
  • 尺寸相同
  • 最高帧率和分辨率不同
型号H x V尺寸帧率长宽比
IMX2961456 x 10881/2.9604:3
IMX297728 x 5441/2.91204:3

Pregius / Pregius S

Pregius = CCD结构 + 有源像素型CMOS + 全局快门

Pregius S = Pregius + 背照结构 + 堆栈式结构

初始化代码

以下是与IMX297相关的代码段:

static void vc_init_ctrl_imx297(struct vc_ctrl *ctrl, struct vc_desc* desc)
{       
        INIT_MESSAGE("IMX297")

        vc_init_ctrl_imx296_base(ctrl, desc);

        FRAME(0, 0, 704, 540) // 720 isn't divisible by 32
        //                      hmax  vmax     vmax   vmax  blkl  blkl  retrigger
        //                             min      max    def   max   def
        MODE(0, 1, FORMAT_RAW10, 550,    5, 0xfffff,  1110,  511,   60,    883008)
}

代码中,vc_init_ctrl_imx297函数首先调用INIT_MESSAGE宏来初始化日志消息,然后调用vc_init_ctrl_imx296_base函数来设置基础控制参数,因为IMX297IMX296复用相同的初始化代码。

接着,调用了一个FRAME宏,设置了图像的宽度和高度。

MODE宏定义了模块的模式设置,包括数据格式、最小和最大行数、默认行数、最小和最大增益、默认增益以及最小重触发时间。这里的FORMAT_RAW10表示使用的是10位原始数据格式。

IMX296相关的代码段

static void vc_init_ctrl_imx296_base(struct vc_ctrl *ctrl, struct vc_desc* desc)
{
        ctrl->gain                      = (vc_control) { .min =   0, .max =       480, .def =      0 };
        
        ctrl->csr.sen.vmax              = (vc_csr4) { .l = 0x3010, .m = 0x3011, .h = 0x3012, .u = 0x0000 };
        ctrl->csr.sen.mode              = (vc_csr2) { .l = 0x3000, .m = 0x300A };
        ctrl->csr.sen.mode_standby      = 0x01;
        ctrl->csr.sen.mode_operating	= 0x00;
        ctrl->csr.sen.blacklevel        = (vc_csr2) { .l = 0x3254, .m = 0x3255 };

        ctrl->flags                     = FLAG_EXPOSURE_SONY;
        ctrl->flags                    |= FLAG_INCREASE_FRAME_RATE;
        ctrl->flags                    |= FLAG_IO_ENABLED;
        ctrl->flags                    |= FLAG_TRIGGER_EXTERNAL | FLAG_TRIGGER_PULSEWIDTH | FLAG_TRIGGER_SELF_V2;
}

这个函数用于初始化IMX296/297传感器的基础控制参数,设置如下:

  1. gain:设置增益控制的最小值(.min)、最大值(.max)和默认值(.def)。增益的可调范围是0到480,默认值为0。

  2. csr.sen.vmax:定义了传感器的最大行数(vmax),这是一个由四个寄存器组成的值,分别是.l(低字节)、.m(中字节)、.h(高字节)和.u(最高字节),用于控制传感器输出图像的最大行数。

  3. csr.sen.mode:设置传感器的模式寄存器,用于控制传感器的工作模式。.mode_standby.mode_operating分别设置了传感器在待机和工作状态下的模式值。

  4. csr.sen.blacklevel:设置了传感器的黑电平校正值,用于调整图像的黑电平。

  5. flags:设置了控制标志,用于启用或禁用特定的功能。此处,启用了曝光模式、帧率增加、IO使能、外部触发、脉冲宽度触发和自触发V2。

控制结构体分析

struct vc_ctrl 是一个重要结构体,它在MIPI驱动中用于存储与相机模块通信、控制和配置相关的数据:

struct vc_ctrl {
        // Communication
        int mod_i2c_addr;
        struct i2c_client *client_sen;
        struct i2c_client *client_mod;
        // Controls
        struct vc_mode mode[8];
        struct vc_control exposure;
        struct vc_control gain;
        struct vc_control framerate;
        // Modes & Frame Formats
        struct vc_frame frame;          // Pixel
        // Control and status registers
        struct vc_csr csr;
        // Exposure
        __u32 clk_ext_trigger;          // Hz
        __u32 clk_pixel;                // Hz
        // Flash
        __u32 flash_factor;
        __s32 flash_toffset;
        // Special features
        __u32 flags;
};
  1. int mod_i2c_addr:模块的I2C地址,用于在I2C总线上识别和通信与模块。

  2. struct i2c_client *client_sen:指向传感器的I2C客户端结构体的指针,用于与传感器进行通信。

  3. struct i2c_client *client_mod:指向模块的I2C客户端结构体的指针,用于与模块进行通信。

  4. struct vc_mode mode[8]:一个数组,包含最多8个模块模式。每个模式定义了数据传输的速率、通道数、格式、类型和双路(binning)设置。

  5. struct vc_control exposure:曝光控制结构体,包含曝光时间的最小值、最大值和默认值。

  6. struct vc_control gain:增益控制结构体,包含增益的最小值、最大值和默认值。

  7. struct vc_control framerate:帧率控制结构体,包含帧率的最小值、最大值和默认值。

  8. struct vc_frame frame:定义了图像的像素格式,包括图像的左上角坐标(left, top)、宽度(width)和高度(height)。

  9. struct vc_csr csr:包含传感器控制和状态寄存器,用于配置传感器的特定参数。

  10. __u32 clk_ext_trigger:外部触发时钟频率,单位是赫兹(Hz)。

  11. __u32 clk_pixel:像素时钟频率,单位是赫兹(Hz)。

  12. __u32 flash_factor:闪光灯因子,用于控制闪光灯的强度或持续时间。

  13. __s32 flash_toffset:闪光灯时间偏移,用于调整闪光灯的开始时间。

  14. __u32 flags:一个无符号整数,用于存储控制标志,这些标志可以表示各种特殊功能或配置选项,例如是否启用某种曝光模式、是否允许增加帧率等。

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值