目录
Pregius = CCD结构 + 有源像素型CMOS + 全局快门
Pregius S = Pregius + 背照结构 + 堆栈式结构
摄像头简介
- 同属3.4系列
- 同属嵌入式应用方向,MIPI接口
- 尺寸相同
- 最高帧率和分辨率不同
型号 | H x V | 尺寸 | 帧率 | 长宽比 |
IMX296 | 1456 x 1088 | 1/2.9 | 60 | 4:3 |
IMX297 | 728 x 544 | 1/2.9 | 120 | 4: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
函数来设置基础控制参数,因为IMX297
和IMX296
复用相同
的初始化代码。
接着,调用了一个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
传感器的基础控制参数,设置如下:
-
gain
:设置增益控制的最小值(.min
)、最大值(.max
)和默认值(.def
)。增益的可调范围是0到480,默认值为0。 -
csr.sen.vmax
:定义了传感器的最大行数(vmax
),这是一个由四个寄存器组成的值,分别是.l
(低字节)、.m
(中字节)、.h
(高字节)和.u
(最高字节),用于控制传感器输出图像的最大行数。 -
csr.sen.mode
:设置传感器的模式寄存器,用于控制传感器的工作模式。.mode_standby
和.mode_operating
分别设置了传感器在待机和工作状态下的模式值。 -
csr.sen.blacklevel
:设置了传感器的黑电平校正值,用于调整图像的黑电平。 -
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;
};
-
int mod_i2c_addr
:模块的I2C地址,用于在I2C总线上识别和通信与模块。 -
struct i2c_client *client_sen
:指向传感器的I2C客户端结构体的指针,用于与传感器进行通信。 -
struct i2c_client *client_mod
:指向模块的I2C客户端结构体的指针,用于与模块进行通信。 -
struct vc_mode mode[8]
:一个数组,包含最多8个模块模式。每个模式定义了数据传输的速率、通道数、格式、类型和双路(binning)设置。 -
struct vc_control exposure
:曝光控制结构体,包含曝光时间的最小值、最大值和默认值。 -
struct vc_control gain
:增益控制结构体,包含增益的最小值、最大值和默认值。 -
struct vc_control framerate
:帧率控制结构体,包含帧率的最小值、最大值和默认值。 -
struct vc_frame frame
:定义了图像的像素格式,包括图像的左上角坐标(left, top)、宽度(width)和高度(height)。 -
struct vc_csr csr
:包含传感器控制和状态寄存器,用于配置传感器的特定参数。 -
__u32 clk_ext_trigger
:外部触发时钟频率,单位是赫兹(Hz)。 -
__u32 clk_pixel
:像素时钟频率,单位是赫兹(Hz)。 -
__u32 flash_factor
:闪光灯因子,用于控制闪光灯的强度或持续时间。 -
__s32 flash_toffset
:闪光灯时间偏移,用于调整闪光灯的开始时间。 -
__u32 flags
:一个无符号整数,用于存储控制标志,这些标志可以表示各种特殊功能或配置选项,例如是否启用某种曝光模式、是否允许增加帧率等。