4. Sensor特性与RAW图采集:Sensor驱动配置与RAW图抓取
本章是图像调优流程的起点。在RK平台上,从Sensor上电、时钟配置到RAW图抓取,每一步都直接影响后续ISP调试的准确性。错误的驱动配置会导致RAW图出现条纹、偏色或帧率异常,因此必须从底层理解Sensor的驱动参数与RAW图采集方法。
4.1 Sensor驱动核心参数配置
Sensor驱动配置主要围绕时钟、帧率与分辨率三个维度展开。下表列出了RK平台下Sensor驱动中必须正确设置的参数及其典型值范围:
| 参数名称 | 驱动节点/宏定义 | 典型值范围 | 说明 |
|---|---|---|---|
| MCLK(主时钟) | sensor->mclk |
6MHz ~ 27MHz | 由RK SoC的MCLK引脚输出,需与Sensor datasheet匹配 |
| PCLK(像素时钟) | sensor->pclk |
24MHz ~ 150MHz | 决定像素数据传输速率,影响帧率上限 |
| 帧率(FPS) | sensor->fps |
15 / 30 / 60 / 120 | 通过VTS(垂直消隐)与HTS(水平消隐)调整 |
| 分辨率(Resolution) | sensor->width / sensor->height |
1920x1080 / 3840x2160 | 需与Sensor输出尺寸严格一致 |
| 曝光行(Line Length) | sensor->line_length |
2200 ~ 4500 | HTS = line_length,影响PCLK与帧率计算 |
| 帧行数(Frame Length) | sensor->frame_length |
1125 ~ 2250 | VTS = frame_length,决定帧周期 |
关键公式:帧率 = PCLK / (HTS × VTS)。在驱动调试阶段,务必使用示波器测量MCLK与PCLK的实际波形,确认时钟频率与寄存器配置一致,避免因时钟偏差导致RAW图采集失败。
4.2 MCLK与PCLK的配置流程
RK平台通过clk_set_rate接口配置Sensor时钟。以下是一个典型的MCLK/PCLK配置代码片段:
/* sensor驱动初始化函数 */
static int sensor_init(struct i2c_client *client)
{
struct sensor_device *sensor = i2c_get_clientdata(client);
/* 1. 获取MCLK句柄并设置频率 */
sensor->mclk = devm_clk_get(&client->dev, "xvclk");
if (IS_ERR(sensor->mclk)) {
dev_err(&client->dev, "Failed to get MCLK\n");
return PTR_ERR(sensor->mclk);
}
clk_set_rate(sensor->mclk, 24000000); /* 24MHz */
/* 2. 使能MCLK */
clk_prepare_enable(sensor->mclk);
/* 3. 配置PCLK(通常由Sensor内部PLL生成,驱动需写入寄存器) */
sensor_write_reg(client, 0x0100, 0x00); /* 进入待机模式 */
sensor_write_reg(client, 0x0300, 0x05); /* PLL倍频系数 */
sensor_write_reg(client, 0x0301, 0x00); /* PLL分频系数 */
sensor_write_reg(client, 0x0302, 0x01); /* PLL后分频 */
/* 等待PLL锁定 */
msleep(10);
/* 4. 配置输出分辨率与帧率 */
sensor_write_reg(client, 0x0340, 0x04); /* VTS高字节 */
sensor_write_reg(client, 0x0341, 0x65); /* VTS低字节 = 1125 */
sensor_write_reg(client, 0x0342, 0x0B); /* HTS高字节 */
sensor_write_reg(client, 0x0343, 0xA0); /* HTS低字节 = 2976 */
return 0;
}
常见错误:MCLK频率设置过高(超过Sensor规格)会导致Sensor发热或输出异常;PCLK与HTS/VTS不匹配会导致帧率偏离预期值。建议在驱动初始化后,通过读取Sensor的状态寄存器(如0x005E)确认PLL锁定状态。
4.3 帧率与分辨率的联动关系
帧率与分辨率并非独立参数,它们通过消隐区(Blanking)相互制约。下图展示了Sensor一帧数据的时序结构:
从图中可以看出,调整帧率时通常修改VTS(垂直总行数)或HTS(水平总像素数)。减小VTS可提高帧率,但会压缩垂直消隐区,可能导致Sensor模拟电路无法完成像素复位,产生拖影或亮度不均。
4.4 RAW图抓取命令:rk_aiq_raw_capture
RK平台提供专用的RAW图抓取工具rk_aiq_raw_capture,该工具直接通过ISP驱动获取未经处理的Sensor RAW数据。以下是标准抓取流程:
- 确认ISP管线状态:确保ISP处于空闲或已停止自动运行状态,避免RAW数据被ISP处理模块污染。
- 设置抓取参数:指定输出路径、RAW位深(10bit/12bit/14bit)、帧数及是否包含Sensor元数据。
- 执行抓取:运行命令,工具会锁定ISP输入端口,直接Dump RAW Buffer。
- 验证文件完整性:检查RAW文件大小是否等于(width × height × bpp / 8)× frame_count。
典型命令示例:
# 抓取1帧10bit RAW图,输出为DNG格式(包含元数据)
rk_aiq_raw_capture -o /data/raw_capture.dng -b 10 -f 1 -m
# 抓取连续5帧12bit RAW图,用于暗电流校准
rk_aiq_raw_capture -o /data/dark_raw_%d.raw -b 12 -f 5 -s 0
# 参数说明:
# -o : 输出文件路径(%d自动编号)
# -b : 位深(8/10/12/14)
# -f : 抓取帧数
# -m : 嵌入Sensor元数据(增益、曝光时间等)
# -s : 抓取前跳过帧数(用于稳定曝光)
抓取注意事项:
- 抓取前务必关闭自动白平衡(AWB)与自动曝光(AE),使用固定增益与曝光时间,确保RAW图反映Sensor原始响应。
- 抓取暗场RAW图时,需用镜头盖完全遮挡光线,且曝光时间与亮场图保持一致。
- DNG格式包含Sensor校准矩阵,便于后续在PC端使用Adobe DNG Converter或RawDigger查看。
4.5 RAW图质量初步检查
抓取RAW图后,需进行快速质量检查,排除硬件或配置问题。检查项目分为以下三个维度:
| 检查项 | 方法 | 合格标准 | 常见异常 |
|---|---|---|---|
| 黑电平(Black Level) | 统计暗场RAW图各通道均值 | R/Gr/Gb/B通道均值偏差 < 2 LSB | 通道间偏差大 → 黑电平校准失效 |
| 固定模式噪声(FPN) | 观察暗场RAW图列向/行向均值曲线 | 无明显竖条纹或横条纹 | 列向FPN → Sensor读出电路问题 |
| 动态范围 | 拍摄灰阶卡,统计RAW直方图 | 直方图无截断,两端保留余量 | 高光溢出 → 曝光时间过长 |
| 坏点(Defect Pixel) | 暗场RAW图中亮度 > 10倍黑电平的像素 | 坏点数量 < 传感器规格书标称值 | 坏点过多 → 需更新坏点表 |
| Bayer模式验证 | 查看RAW图2x2像素块排列 | 与Sensor datasheet定义的Bayer顺序一致 | Bayer顺序错误 → ISP解马赛克出现伪色 |
以下是一个使用Python脚本快速检查RAW图黑电平的示例:
import numpy as np
def check_black_level(raw_path, width, height, bpp=10):
"""检查RAW图黑电平"""
# 读取RAW数据(假设为Bayer BGGR排列)
raw_data = np.fromfile(raw_path, dtype=np.uint16)
raw_data = raw_data.reshape((height, width))
# 提取各通道
B = raw_data[0::2, 0::2] # Blue通道
Gb = raw_data[0::2, 1::2] # Green-blue通道
Gr = raw_data[1::2, 0::2] # Green-red通道
R = raw_data[1::2, 1::2] # Red通道
# 计算均值
black_levels = {
'R': np.mean(R),
'Gr': np.mean(Gr),
'Gb': np.mean(Gb),
'B': np.mean(B)
}
# 输出结果
for ch, val in black_levels.items():
print(f"{ch}通道黑电平: {val:.2f} LSB")
# 判断是否合格
max_diff = max(black_levels.values()) - min(black_levels.values())
if max_diff < 2.0:
print("黑电平检查通过,通道间偏差: {:.2f} LSB".format(max_diff))
else:
print("警告:通道间偏差过大 ({:.2f} LSB),需校准黑电平".format(max_diff))
# 使用示例
check_black_level("/data/dark_raw.raw", 1920, 1080, 10)
重要提示:RAW图质量检查必须在未开启任何ISP处理模块(如DPC、LSC、BLC)的情况下进行。如果抓取时ISP已介入,RAW数据将包含非Sensor本底的处理结果,导致后续调优方向错误。建议在抓取前通过
rk_aiq_raw_capture -s 3跳过前几帧,确保Sensor处于稳定工作状态。
4.6 本章小结
Sensor驱动配置是RAW图采集的基础,MCLK/PCLK的精度直接影响帧率与数据完整性。通过rk_aiq_raw_capture工具可以获取纯净的Sensor RAW数据,而黑电平、FPN、坏点等质量检查是判断Sensor工作状态是否正常的快速手段。下一阶段将基于本章采集的RAW图,进行黑电平校准与去噪预处理。