OV13855是一款1300万像素的MIPI CSI-2接口图像传感器,在嵌入式视觉系统中应用广泛。RK3588作为瑞芯微旗舰级SoC,其双通道MIPI CSI-2控制器最高支持8 Lane数据吞吐。香橙派5开发板通过40pin FPC连接器引出两组MIPI CSI接口,为摄像头模组提供硬件支持。
在实际项目中,我们需要关注三个关键硬件特性:
硬件设计警示:错误的供电时序可能直接损坏传感器芯片,调试阶段建议使用可编程电源模块逐步验证。
RK3588的Linux内核需要启用以下关键配置选项:
bash复制CONFIG_MEDIA_SUPPORT=y
CONFIG_VIDEO_DEV=y
CONFIG_V4L2_FWNODE=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_VIDEO_OV13850=y # OV13855通常使用兼容驱动
设备树(DTS)需要明确定义传感器节点:
dts复制&i2c1 {
status = "okay";
ov13855: camera@10 {
compatible = "ovti,ov13855";
reg = <0x10>;
clocks = <&cru CLK_MIPI_CAMARAOUT_M1>;
clock-names = "xvclk";
power-domains = <&power RK3588_PD_VI>;
pinctrl-names = "default";
pinctrl-0 = <&mipim1_camera1_clk>;
reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
pwdn-gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
port {
ov13855_out: endpoint {
remote-endpoint = <&mipi_in_ucam0>;
data-lanes = <1 2 3 4>;
};
};
};
};
推荐安装以下调试工具:
bash复制# V4L2调试工具
sudo apt install v4l-utils
# Media控制器工具
sudo apt install media-ctl
# I2C工具集
sudo apt install i2c-tools
关键调试命令示例:
bash复制# 检测设备识别
v4l2-ctl --list-devices
# 查看子设备拓扑
media-ctl -p -d /dev/media0
# 读取传感器寄存器
i2cdump -y 1 0x10
RK3588的MIPI驱动采用分层架构:
驱动加载流程示例:
code复制[ 2.345678] ov13855 1-0010: Probing OV13855
[ 2.356789] ov13855 1-0010: Detected OV13855 sensor
[ 2.367890] rkcif-mipi-lvds: Linked as a consumer to 1-0010
[ 2.378901] rkisp-vir0: Bound 1-0010
关键时钟树配置:
电源管理注意事项:
典型寄存器配置流程:
c复制static const struct regval ov13855_init_regs[] = {
{0x0103, 0x01}, // SW Reset
{0x0100, 0x00}, // Stream Off
{0x0302, 0x32}, // PLL1预分频
{0x0303, 0x00}, // PLL1倍频
{0x030e, 0x02}, // PLL2分频
{0x030f, 0x04}, // PLL2配置
{0x0312, 0x01}, // PLL2使能
{0x3000, 0x00}, // 特殊功能控制
{0x3002, 0xe8}, // 模拟控制
{0x3005, 0x00}, // 测试模式
{0x3007, 0x00}, // 数字控制
{0x3014, 0x09}, // IO控制
{0x3018, 0x33}, // 数据格式
{0x3020, 0x93}, // 时钟分频
{0x3022, 0x01}, // 输出控制
{0x3031, 0x0a}, // 数据速率
{0x303c, 0x11}, // MIPI控制
{0x3106, 0x11}, // 时钟控制
{0x3503, 0x07}, // AEC控制
{0x3614, 0x80}, // 增益控制
{0x3622, 0x01}, // 传感器控制
{0x3633, 0x43}, // 模拟控制
{0x3635, 0x81}, // 数字控制
{0x3638, 0xce}, // 时序控制
{0x3641, 0x0c}, // 数据路径
{0x3703, 0x5a}, // 传感器接口
{0x3705, 0x18}, // 输出控制
{0x370c, 0xa0}, // 数据格式
{0x3717, 0x58}, // 测试模式
{0x3732, 0x12}, // 数字控制
{0x3733, 0x10}, // 时序控制
{0x376b, 0x1a}, // 模拟控制
{0x3781, 0x80}, // 数据路径
{0x37c2, 0x04}, // 接口控制
{0x37c5, 0x00}, // 测试模式
{0x37c7, 0x00}, // 数字控制
{0x3800, 0x00}, // X起始地址
{0x3801, 0x00}, // X起始地址
{0x3802, 0x00}, // Y起始地址
{0x3803, 0x00}, // Y起始地址
{0x3804, 0x0a}, // X结束地址
{0x3805, 0x3f}, // X结束地址
{0x3806, 0x07}, // Y结束地址
{0x3807, 0x9f}, // Y结束地址
{0x3808, 0x0a}, // X输出尺寸
{0x3809, 0x20}, // X输出尺寸
{0x380a, 0x07}, // Y输出尺寸
{0x380b, 0x98}, // Y输出尺寸
{0x380c, 0x0b}, // HTS
{0x380d, 0x1c}, // HTS
{0x380e, 0x07}, // VTS
{0x380f, 0xb0}, // VTS
{0x3810, 0x00}, // H窗口起始
{0x3811, 0x10}, // H窗口起始
{0x3812, 0x00}, // V窗口起始
{0x3813, 0x04}, // V窗口起始
{0x3814, 0x11}, // H窗口尺寸
{0x3815, 0x11}, // V窗口尺寸
{0x3820, 0x40}, // 翻转控制
{0x3821, 0x00}, // 镜像控制
{0x382a, 0x01}, // 时钟分频
{0x382b, 0x01}, // 时钟控制
{0x3830, 0x06}, // 数字控制
{0x3836, 0x01}, // 时序控制
{0x3f08, 0x10}, // 测试模式
{0x4001, 0x10}, // 黑电平控制
{0x4022, 0x07}, // 窗口控制
{0x4025, 0x04}, // 窗口控制
{0x4027, 0x04}, // 窗口控制
{0x4028, 0x00}, // 窗口控制
{0x4029, 0x00}, // 窗口控制
{0x402a, 0x00}, // 窗口控制
{0x402b, 0x00}, // 窗口控制
{0x402e, 0x00}, // 窗口控制
{0x402f, 0x00}, // 窗口控制
{0x4600, 0x01}, // 数据格式
{0x4601, 0x97}, // 数据格式
{0x4837, 0x14}, // MIPI时序
{0x5000, 0x06}, // LENC控制
{0x5001, 0x01}, // BLC控制
{0x5002, 0x40}, // 数字控制
{0x5003, 0x08}, // 测试模式
{0x5780, 0x3e}, // 镜头阴影
{0x5781, 0x0f}, // 镜头阴影
{0x5782, 0x44}, // 镜头阴影
{0x5783, 0x02}, // 镜头阴影
{0x5784, 0x01}, // 镜头阴影
{0x5785, 0x01}, // 镜头阴影
{0x5786, 0x00}, // 镜头阴影
{0x5787, 0x04}, // 镜头阴影
{0x5788, 0x02}, // 镜头阴影
{0x5789, 0x0f}, // 镜头阴影
{0x578a, 0xfd}, // 镜头阴影
{0x578b, 0xf5}, // 镜头阴影
{0x578c, 0xf5}, // 镜头阴影
{0x578d, 0x03}, // 镜头阴影
{0x578e, 0x08}, // 镜头阴影
{0x578f, 0x0c}, // 镜头阴影
{0x5790, 0x08}, // 镜头阴影
{0x5791, 0x04}, // 镜头阴影
{0x5792, 0x00}, // 镜头阴影
{0x5793, 0x52}, // 镜头阴影
{0x5794, 0xa3}, // 镜头阴影
{0x5b00, 0x02}, // 测试模式
{0x5b01, 0x10}, // 测试模式
{0x5b02, 0x03}, // 测试模式
{0x5b03, 0xcf}, // 测试模式
{0x5b05, 0x6c}, // 测试模式
{0x5e00, 0x00}, // 测试模式
{0x5e01, 0x41}, // 测试模式
{0x0100, 0x01}, // Stream On
};
支持的主要格式配置:
格式切换示例:
c复制static const struct v4l2_mbus_framefmt ov13855_default_fmt = {
.width = 4224,
.height = 3136,
.code = MEDIA_BUS_FMT_SBGGR10_1X10,
.field = V4L2_FIELD_NONE,
.colorspace = V4L2_COLORSPACE_RAW,
.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
.quantization = V4L2_QUANTIZATION_DEFAULT,
.xfer_func = V4L2_XFER_FUNC_DEFAULT,
};
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 无设备识别 | I2C通信失败 | 用示波器检查SCL/SDA信号 |
| 图像条纹 | 时钟抖动过大 | 测量MIPI时钟眼图质量 |
| 图像偏色 | 寄存器配置错误 | 检查ISP输入格式配置 |
| 帧率不稳 | MIPI带宽不足 | 降低分辨率或减少Lane数 |
| 系统死机 | 电源噪声干扰 | 检查各电源轨纹波 |
实时调整曝光参数:
bash复制v4l2-ctl -d /dev/video0 --set-ctrl exposure=100
获取当前格式信息:
bash复制v4l2-ctl -d /dev/video0 --get-fmt-video
Dump MIPI数据包:
bash复制echo 1 > /sys/module/videobuf2_core/parameters/debug
dmesg | grep MIPI
内存带宽优化:
ISP流水线调优:
bash复制# 设置ISP工作模式
echo performance > /sys/devices/platform/ff660000.rkisp1/performance
MIPI时序调整:
dts复制&csi2_dphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_ucam0: endpoint@1 {
reg = <1>;
remote-endpoint = <&ov13855_out>;
data-lanes = <1 2 3 4>;
lane-polarities = <1 0 1 0>;
};
};
};
};
在实际调试中,我发现OV13855对复位时序非常敏感。正确的复位序列应该是:
另一个容易忽视的问题是MIPI Lane的极性配置。通过示波器测量发现,某些模组的Lane极性可能与常规情况相反,此时需要在设备树中明确指定:
dts复制lane-polarities = <1 0 1 0>; /* 分别对应Lane0-3的极性 */