相机传感器调试
本文档主要介绍相机传感器调试过程中的驱动开发流程及注意事项。相机传感器调试可按照下图所示流程实施:
传感器调试流程
准备材料
确认技术参数
开发相机传感器的驱动程序前,先获取相机传感器的技术规格书以及设计指南,了解相机传感器的帧率、输出尺寸、数据格式是否符合芯片的接口需求,并按照如下格式向传感器原厂申请初始化配置列表:
Sensor name: OV2710
SoC name: ESP32-P4
Output size: 640x480
FPS: 30
Input Clock: 24 MHz
Output mode: Linear mode
Interface: MIPI 2 data lanes
Output format: RGB RAW8
获取传感器初始化设置,一般至少要准备最大规格和标准分辨率两种序列。
注意
对于使用 MIPI 接口的传感器,注意 MIPI 的一些参数需要符合接收端的需求。要求每个数据线的速率不大于 1.0 Gbps,禁用行同步包,MIPI 时钟采用非连续模式。
硬件连接
根据使用的相机接口,参考官方开发板的电路设计,向负责制作相机模组的厂商申请相机模组。相机模组的硬件设计过程中需要重点关注以下几个方面:
相机传感器的供电电源,包括 AVDD、DVDD、DOVDD。
相机传感器的输入时钟 XCLK 是使用外部晶振还是使用芯片的输出时钟。
PWDN (Power Down)、RST (Reset) 管脚是否与传感器连接。
不同接口的传感器模组与开发板的连接的方式不同。
SPI 接口的相机传感器与开发板连接的示意图如下:
------------------ ------------------ | 相机传感器 | | 芯片 | | | 数据链路 | | | Data1 |--------------------->| Data1 | | Data0 |--------------------->| Data0 | | | | | | XCLK(Optional) |<---------------------| XCLK | | VSYNC |--------------------->| VSYNC | | PCLK |--------------------->| PCLK | ------------------ ------------------ | I2C 从机 | SCCB 控制链路 | I2C 主机 | | SCL |<---------------------| SCL | | SDA |<-------------------->| SDA | ------------------ ------------------
DVP 接口的相机传感器与开发板连接的示意图如下:
------------------ ------------------ | 相机传感器 | | 芯片 | | | 数据链路 | | | Data7 |--------------------->| Data7 | | Data6 |--------------------->| Data6 | | Data5 |--------------------->| Data5 | | Data4 |--------------------->| Data4 | | Data3 |--------------------->| Data3 | | Data2 |--------------------->| Data2 | | Data1 |--------------------->| Data1 | | Data0 |--------------------->| Data0 | | | | | | PCLK |--------------------->| PCLK | | HREF |--------------------->| HREF | | VSYNC |--------------------->| VSYNC | | | | | ------------------ ------------------ | I2C 从机 | 控制链路 | I2C 主机 | | SCL |<---------------------| SCL | | SDA |<-------------------->| SDA | ------------------ ------------------
MIPI 接口的相机传感器与开发板连接的示意图如下:
------------------ ------------------- | CSI 发送端 | | CSI 接收端 | | | 数据链路 | | | Data1+ |--------------------->| Data1+ | | Data1- |--------------------->| Data1- | | Data0+ |--------------------->| Data0+ | | Data0- |--------------------->| Data0- | | | | | | CLK+ |--------------------->| CLK+ | | CLK- |--------------------->| CLK- | | | | | ------------------ ------------------- | CCI 从机 | 控制链路 | CCI 主机 | | SCL |<---------------------| SCL | | SDA |<-------------------->| SDA | ------------------ -------------------
获取传感器 ID
准备传感器驱动
通过软件程序查询相机传感器的 ID,可以验证硬件连接是否正确、以及 I2C 通信是否正常。这需要先实现相机传感器的驱动程序。
可以找一款规格相近的相机传感器,参考其驱动进行修改适配。更多介绍可以参考 Add new camera sensor drivers 。
重要
esp_cam_sensor 组件中默认使用 7 bit 的 I2C 地址。
测试 I2C 通信
在硬件连接正确,设备的管脚配置正确的情况下,运行 capture stream 示例,若显示如下日志则说明测试正常。
I (5310) example_init_video: MIPI-CSI camera sensor I2C port=0, scl_pin=8, sda_pin=7, freq=100000
I (5320) ov5645: Detected Camera sensor PID=0x5645
注意
如果需要配置相机传感器的 PWDN 和 RST 管脚,推荐在应用层代码中控制这些接口的电平。
如果使用芯片管脚输出 XCLK 时钟信号,请参考 xclk_generator 示例中的 API 来生成该信号。
在管脚配置正确,传感器供电正常,XCLK 正常的情况下,也可以尝试使用 i2c_tools 示例来探测设备的 I2C 地址信息。
完善传感器格式信息
参考相机传感器的技术手册以及传感器厂家提供的初始化列表,完善代表传感器格式信息的结构体 esp_cam_sensor_format_t 。以 OV2710 为例,该结构体包含的信息有:
static const esp_cam_sensor_format_t ov2710_format_info[] = {
/* 对于 MIPI 接口的传感器 */
{
.name = "MIPI_1lane_24Minput_RAW10_1920x1080_25fps",
.format = ESP_CAM_SENSOR_PIXFORMAT_RAW10,
.port = ESP_CAM_SENSOR_MIPI_CSI,
.xclk = OV2710_MCLK,
.width = 1920,
.height = 1080,
.regs = ov2710_mipi_1lane_24Minput_1920x1080_raw10_25fps,
.regs_size = ARRAY_SIZE(ov2710_mipi_1lane_24Minput_1920x1080_raw10_25fps),
.fps = 25,
.isp_info = &ov2710_isp_info[0],
.mipi_info = {
.mipi_clk = 800000000,
.lane_num = 1,
.line_sync_en = false,
},
.reserved = NULL,
}
};
注意
对于 MIPI 接口的传感器,MIPI 的接口信息可以咨询传感器的 FAE 或者查看原厂提供的寄存器初始化列表信息。
通常传感器的寄存器初始化列表会按照 soft reset -> standby enable -> sensor format init 的顺序进行配置,然后在调用
sensor_set_stream()时切换到 standby disable 模式来输出数据。
在测试模式下采集图像
传感器的测试模式可以输出有一定规律的数据,这有助于检查接收端的配置是否与发送端匹配。你可以参考相机传感器的技术手册,实现该传感器测试模式的使能接口。然后编译并运行可以预览图像的 examples ,确认测试模式下的图像是否符合预期。
以 OV2710 为例,需要以下步骤来完成:
实现使能测试模式的接口
ov2710_set_test_pattern()。在
ov2710_set_stream()函数返回前,调用ov2710_set_test_pattern()启用测试模式。编译示例,预览测试模式的图像。
注意
尽管一些输出 YUV 数据的传感器可以正常被初始化并在接收端接收到数据,但是最终显示的图像颜色异常。此时应检查传感器的信号极性、管脚驱动能力,数据大小端配置以及 YUYV 发送顺序。
对于输出 RAW 数据的传感器,格式信息中还包括图像信号处理器 (Image Signal Processor, ISP) 信息。不正确的 ISP 信息将导致图像异常,但是不影响接收数据。若测试模式下编码后的图像异常,可以尝试更改
esp_cam_sensor_isp_info_t中的bayer_type参数,直到测试图像与传感器技术规格书的一致。另外,传感器的 vflip 和 hmirror 功能会影响传感器的 bayer_type 参数。推荐通过运行 web 示例在浏览器中预览图像,也可以通过 LCD、USB 等接口预览。
完善 ISP 功能
对于输出 RAW 数据的传感器,还需提供正确的控制信息供 ISP 外设使用。
其中关于自动曝光 (Auto Exposure, AE) 控制信息,请参考相机传感器的技术手册,并按照如下顺序实现相关的接口:
sensor_set_exp_val():该接口用于设置相机传感器的曝光时间。sensor_set_total_gain_val():该接口用于设置相机传感器的增益信息。传感器的增益分为数字增益、模拟增益,该接口设置总增益,总增益 = 模拟增益 x 数字增益。sensor_query_para_desc():该接口用于查询相机传感器的曝光、增益取值范围,默认值等信息。sensor_set_para_value():该接口用于设置相机传感器的 ISP 控制参数。
注意
一些输出 RAW 数据的传感器可以输出黑电平、亮度的实时统计数据。这些传感器需要特殊的 API,并完善 ISP 相关的其他参数,请联系乐鑫的技术人员完成技术支持。
传感器默认的 ISP 控制信息,比如默认的曝光值、增益值,请确认与对应的寄存器列表信息一致。
测试 AE 配置
在完善 AE 配置信息后,可以启用一个定时器,在定时器中调用设置曝光、增益控制的接口,让配置参数递增或者递减变化,在可以预览图像的 examples 中,查看图像的亮度是否平滑地过渡。
协助 ISP 调优人员进行图像质量调优
验证噪声和颜色
传感器驱动开发人员需要配合 ISP 调试人员验证不同增益下的噪声情况,完善增益的控制数组以及曝光时间的控制,平衡亮度变化的平滑性和噪声情况。此外,对于一些拥有部分 ISP 的传感器,其 ISP 相关的功能,如黑电平校正、坏点校正功能,也需要配合 ISP 调试人员进行验证。
图像质量调优
协助图像质量调试人员优化图像质量。