ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RV1106 MIPI/LVDS设备树配置实战:从sensor接入到ISP图像调优全记录

RV1106 MIPI/LVDS设备树配置实战:从sensor接入到ISP图像调优全记录 如果你最近也在折腾RV1106的开发板大概率绕不开三件事把sensor接上MIPI接口、把图像从内部的ISP管线里跑通、再把画面送到LVDS屏上。这个片子定位是低成本机器视觉SoC单核Cortex-A7功耗很低但自带ISP和视频编解码做IPC、门锁、工业相机都挺合适。官方SDK虽然给了一套默认设备树可真到硬件上接某个具体sensor、点某块具体屏幕的时候设备树几乎都得改一遍。我这次项目用的是GC2053这颗200万像素sensor走MIPI CSI进RV1106的ISP再通过MIPI DSI转LVDS桥接芯片输出到一块7寸1024×600的工业屏。前前后后折腾了两周把MIPI接线、LVDS电平、设备树里的endpoint对接、ISP的IQ调优全部踩了个遍。这篇文章就把整个调试链路、设备树的关键配置、以及我踩过的坑一条条写清楚正在做RV1106/RK3566这类瑞芯微方案的朋友应该都能找到对号入座的点。1. 项目概述与调试链路拆解1.1 这次项目到底在调什么很多人拿到RV1106开发板第一反应是先跑通官方demo然后再换自己的sensor和屏幕。结果发现换硬件之后问题一大堆sensor的I2C地址对不上、MCLK频率不对、MIPI lane数不匹配、ISP出图全黑、LVDS屏花屏。这些问题的根源几乎都在设备树和设备树背后的硬件连接上。RV1106的摄像头输入接口是MIPI CSI-2内部ISP负责把sensor输出的RAW图变成高质量的YUV/RGB数据显示输出则要看板卡设计。RV1106本身有MIPI DSI和并口RGB输出能力如果你的屏是LVDS接口通常要加一颗DSI转LVDS或者RGB转LVDS的桥接芯片。也就是说这条链路从物理上讲是sensor - MIPI CSI - ISP - 显示控制器 - MIPI DSI - 桥接芯片 - LVDS屏。软件层面sensor通过I2C控制MIPI物理层由CSI2 DPHY模块管理ISP处理后的数据走v4l2框架输出显示部分在DRM框架下配置timing。设备树就是把这些模块的“关系”描述清楚谁挂在哪个I2C总线上、谁连谁的endpoint、时钟从哪里来、复位用哪个引脚全部以节点的形式写进dts/dtsi。1.2 数据通路与设备树节点对应关系搞清楚节点对应关系比死记命令更重要。我习惯把这条链路的每一级和设备树节点做一个映射数据流阶段对应设备树节点主要作用sensor采集RAW数据传感器节点如gc205337配置I2C地址、MCLK、复位引脚MIPI物理层接入csi2_dphy0节点配置lane数、时钟频率范围图像数据接收与ISP处理rkcif、rkisp节点配置输入格式、处理通路显示控制器输出mipi_dsi、lvds节点配置timing、lane映射屏幕本体panel节点或bridge节点配置分辨率、porch、使能引脚设备树本质上是一份“硬件描述表”内核驱动通过compatible字符串去匹配对应的驱动通过节点里的属性去拿硬件资源。所以设备树写错了表现往往是驱动probe失败、sensor读不到ID、ISP没有数据输出、DRM encoder找不到panel各种奇奇怪怪的故障但本质都是节点关系没对上。我在调试时习惯先把链路在纸上画一遍标出每个endpoint的remote-endpoint对应关系再去改设备树这样能避免很多低级错误。2. MIPI与LVDS接口的硬件连接要点2.1 MIPI D-PHY接线不是简单把线连起来就行MIPI D-PHY是差分信号一组CLK lane加若干条data lane。CSI-2摄像头一般用1~4条data laneDSI屏幕也类似。硬件上最关键的点是差分阻抗100欧姆布线时要走差分对且每条lane的等长控制要尽量做好。很多人第一次画MIPI板子容易犯两个错误第一在MIPI数据线上加了串联耦合电容。MIPI D-PHY是支持LP低功耗模式的LP模式是靠共模电压变化传输信号的加了AC耦合电容会把LP信号直接吃掉导致链路起不来。MIPI链路本身是DC耦合设计不需要像SerDes那样隔直。第二把clock lane和data lane的顺序搞错。MIPI DSI/CSI的lane是有序的设备树里>i2c0 { status okay; clock-frequency 100000; gc2053: gc205337 { compatible galaxycore,gc2053; reg 0x37; pinctrl-names default; pinctrl-0 mipimux_out; reset-gpios gpio2 RK_PB1 GPIO_ACTIVE_LOW; pwdn-gpios gpio2 RK_PB0 GPIO_ACTIVE_HIGH; clocks cru CLK_MIPICAM_OUT; clock-names xvclk; assigned-clocks cru CLK_MIPICAM_OUT; assigned-clock-rates 24000000; rockchip,camera-module-index 0; rockchip,camera-module-facing back; rockchip,camera-module-name default; rockchip,camera-module-lens-name default; port { gc2053_out: endpoint { remote-endpoint mipi_in_csi0; >gpiod_set_value_cansleep(sensor-reset_gpio, 0); msleep(20); gpiod_set_value_cansleep(sensor-reset_gpio, 1); msleep(20);如果你用的某些驱动支持reset-delay-ms设备树属性就可以直接在dts里调复位时间。遇到sensor在低温或者上电瞬间忙不过来时把复位释放后的等待时间从20ms调到50ms往往就能解决。这个比改代码方便也能减少对驱动源码的侵入。还有一个常见问题是sensor的pwdn和reset引脚初始电平不对。GC2053的pwdn-gpios实际电平逻辑是低有效还是高有效不同模组厂商的定义不一样很多转接板会把引脚定义标反。设备树里先按一版配置测试如果sensor启动电流异常或者一直不进流就把GPIO_ACTIVE_HIGH和GPIO_ACTIVE_LOW对调试试。3.4 显示通路MIPI DSI与LVDS屏的timing配置显示部分如果走MIPI DSI转LVDS桥接设备树里除了桥接芯片节点还要在DSI节点下挂一个panel子节点或者直接配置bridge节点。以常见方式为例mipi_dsi { status okay; panel0 { compatible simple-panel; reg 0; backlight backlight; reset-gpios gpio2 RK_PC5 GPIO_ACTIVE_LOW; reset-delay-ms 50; enable-gpios gpio2 RK_PC4 GPIO_ACTIVE_HIGH; enable-delay-ms 100; display-timings { timing0 { clock-frequency 51200000; hactive 1024; vactive 600; hback-porch 160; hfront-porch 160; hsync-len 10; vback-porch 20; vfront-porch 12; vsync-len 2; hsync-active 0; vsync-active 0; de-active 1; pixelclk-active 0; }; }; port { panel_in_dsi: endpoint { remote-endpoint dsi_out_panel; }; }; }; }; mipi_dsi_out { dsi_out_panel: endpoint { remote-endpoint panel_in_dsi; }; };display-timings里的clock-frequency是像素时钟必须和面板规格书完全一致。我之前遇到过一种情况panel规格书写的是“Pixel Clock 51.2MHz Typ.”但实际工作在51.75MHz才不闪屏最后用示波器慢慢扫出来的。像素时钟和porch参数之间有个简单关系clock-frequency ≈ (hactive hback-porch hfront-porch hsync-len) × (vactive vback-porch vfront-porch vsync-len) × 刷新率。比如1024×60060Hz用上面的porch算出来大概是(102416016010) × (60020122) × 60 51.75MHz所以规格书如果标51.2MHz说明porch会有细微差别直接抄规格书才有意义。3.5 竖屏改横屏与坐标方向调整做工业屏经常遇到“模组本身是竖屏但产品要做横屏显示”的需求。对于LVDS屏理论上垂直刷新方向可以通过数据映射调整但最稳妥的办法是在panel节点加rotation属性panel0 { compatible simple-panel; rotation 90; ... };内核DRM框架会根据rotation属性做旋转但要注意的是旋转是在显示控制器之后进行的如果MIPI DSI的lane数或数据带宽不够旋转同样会增加显存带宽占用。RV1106这类低成本片子带一块大分辨率屏幕旋转时优先检查DDR带宽和DPHY速率是否吃紧。另外一个方向问题是sensor的镜像翻转。如果摄像头画面左右反了不要急着改硬件先看sensor驱动对rockchip,camera-module-facing的处理。sensor寄存器里一般有MIRROR/FLIP控制位在设备树里没有标准属性直接控制需要改驱动或者通过传感器的init sequence寄存器表调整。4. ISP管线和图像质量调优4.1 ISP pipeline到底在处理什么RV1106内部的ISP对sensor输出的RAW Bayer图做一系列处理才输出我们看到的YUV图。这个管线通常包括BLS黑电平校准把sensor暗电流导致的偏置去掉。BPC坏点矫正替换sensor上的死点、亮点和闪烁点。LSC镜头阴影校正补偿镜头边缘进光不足导致四角发暗。Demosaic去马赛克把Bayer格式插值成RGB三通道。CC颜色校正矩阵修正色彩串扰让白平衡更准确。Gamma伽马校正调整亮度曲线让显示更自然。降噪和锐化抑制噪声同时保留细节。很多人以为ISP就是把RAW转成彩色图其实每个模块都对应了一个成像质量问题。比如画面四角发暗是LSC没校准画面有固定白点是BPC坏点表没更新颜色偏紫可能是Demosaic或者CC参数不对。4.2 3A调参与IQ文件3A指的是AE自动曝光、AWB自动白平衡、AF自动对焦。RV1106的ISP通过统计模块计算图像的亮度直方图、色温分布、对焦评价函数然后把结果反馈给sensor调节曝光时间和增益。Rockchip的ISP调优依赖IQ文件在SDK里一般放在/etc/iqfiles/目录下。IQ文件里保存了AE的目标亮度、AWB的颜色温度范围、LSC的校准数据、BPC的坏点表等内容。每次启动ISP驱动会根据当前sensor的名字加载对应的IQ文件。调试3A时我常用的流程是先用v4l2-ctl抓一帧原始RAW看看sensor输出是否正常。进系统后确认IQ文件有没有加载成功dmesg里能看到Load IQ file ... done。对着不同色温的灯箱观察实时图像的AE/AWB收敛速度。需要精细调AE时改IQ文件里AE的目标亮度和速度不要改sensor驱动。4.3 坏点矫正、LSC与偏色问题“坏点矫正”在IPC项目里几乎是必调的。sensor用久了会出现固定亮点或黑点ISP的BPC模块有两种处理方式静态坏点表通过产线校准写入动态检测ISP实时检测异常点并替换。如果你出图后发现固定的亮点先确认IQ文件里BPC模块是否enable。如果enable了还有坏点多半是坏点表没建立。产线校准可以通过Rockchip的ISP tuning工具跑一次坏点检测生成新的IQ文件替换进去。LSC镜片阴影校正需要采集一张均匀光照的灰板图像然后让ISP算法计算每个区域的增益。很多研发环境没有积分球会拿一张白纸在均匀光下代替精度差一些但做初步调色够用。如果画面边缘和中心亮度差超过30%那么LSC是必调的否则客户一眼就能看出四角发暗。去马赛克这一块有个经验边缘伪彩往往不是Demosaic没调好而是前面BLS或者LSC先出了问题。先保证RAW数据干净再去动后面的模块不会错。4.4 用媒体拓扑确认链路状态设备树改完之后系统起来要确认链路是否真的连上了。Rockchip的v4l2框架支持media-ctl查看拓扑media-ctl -p正常的话能看到sensor实体、csi2-dphy实体、rkisp实体之间是有链接的。如果sensor节点没有出现多半是驱动probe失败去查I2C和GPIO。如果sensor出现了但csi2-dphy没有link检查remote-endpoint的指向。抓图命令一般是这样v4l2-ctl -d /dev/video0 --set-fmt-videowidth1920,height1080,pixelformatRG10 --stream-mmap --stream-count1抓到RAW后用工具转成PNG直接看图的颜色和坏点情况能快速判断ISP各模块有没有生效。5. 常见问题与排查技巧实录5.1 “出不了图”的三板斧每次有人问我“sensor为什么出不了图”我都是先给三板斧看dmesg、看media-ctl -p、看GPIO电平。先看dmesgdmesg | grep -iE gc2053|rkcif|rkisp|csi2如果驱动probe都没跑就去查设备树compatible和I2C地址。如果probe成功了但streaming时报错比如timeout或者no signal就用示波器去看sensor的MCLK和MIPI输出。GPIO电平这一条经常被忽略。通过shell操作GPIO来测试reset和pwdn引脚的电平echo 18 /sys/class/gpio/export # 根据板卡GPIO编号操作确认复位引脚能否拉高拉低在调试时能快速确认设备树里GPIO号是不是写错了。我之前就遇到过设备树里reset-gpios指向的引脚和实际原理图差了一位dmesg里看着driver初始化正常但sensor就是没有MIPI输出最后就是靠手动翻转GPIO定位到的。5.2 设备树配置常见错误速查现象可能原因排查方法sensor一直读不到IDI2C地址错误、MCLK没输出、复位未释放量MCLK和复位电平I2C扫描MIPI信号有但不锁定lane数量配错、link-frequencies超范围对照sensor输出配置data-lanesISP出图全黑输入格式不对、BLS参数导致全黑先抓RAW确认sensor本身有数据图像偏红/偏蓝AWB未收敛、IQ文件没加载确认iqfiles是否加载成功画面有大量彩点Demosaic前数据异常、BPC未开检查BPC和RAW数据质量只有下半屏有画面lane映射顺序错误查询MIPI lane接收顺序并调整还有一个很容易错的地方是assigned-clock-rates没配或者配错。有些sensor驱动在probe时不会检查MCLK频率导致初始化寄存器序列里写入的曝光时间、帧率全部按错误时钟计算表现就是帧率不对、曝光不对、图像时快时慢。这类问题用示波器量一下XCLK和PCLK的比值就能发现。5.3 LVDS屏花屏与无显示排查LVDS屏花屏优先查两个点data mapping和timing。先确定屏是VESA还是JEIDA格式然后确认设备树和桥接芯片配置一致。然后是porch参数LVDS屏对前后肩比较敏感有的屏要求hsync-len不能太短有的要求DE必须高有效逐项对照面板规格书。如果LVDS屏完全无显示按这个顺序排查确认背光已经点亮能排除背光驱动问题。量桥接芯片的输出时钟和LVDS电平有无差分输出。确认桥接芯片I2C有没有配置成功i2cdetect -y bus能扫到地址。确认DSI链路有没有图像数据用示波器量DSI lane的HS脉冲如果只有init序列没有持续的数据传输说明DRM没真正打开的panel。很多桥接芯片上电后需要先复位再配置如果复位释放太早或者太晚I2C能扫到但设置不生效表现为“第一次上电黑屏断电重启就好”。这种问题就在设备树里把reset-delay-ms和enable-delay-ms拉开比如复位释放后延时100ms再使能基本能解决。5.4 调试命令与工具清单最后把我实际用过且觉得高效的工具整理一下工具/命令用途dmesg看驱动probe和streaming日志media-ctl -p查看v4l2拓扑和link状态v4l2-ctl抓图、设置格式、测试streamingi2cdetect扫描I2C设备地址示波器量MCLK、MIPI波形、LVDS差分信号Rockchip ISP IQ Tool调试3A、生成IQ文件cat /sys/kernel/debug/dri/0/state查看DRM显示状态调试到后期我基本不靠猜每次改设备树之前先media-ctl -p截一份拓扑存档改完之后再对比链路状态一目了然。ISP的IQ文件也做好版本管理每次只改一个参数记录前后对比图不然调两天下来自己都忘了哪个参数是干什么的。6. 最后分享一点实际体会这次RV1106项目做完最大的一个感受是这类嵌入式视觉开发真正耗时间的不是点屏也不是驱动sensor而是“链路通没通”和“图像质量是否达标”这两件看起来模糊的事。设备树只是把硬件关系说清楚真正的坑都在电气细节和时序细节里。建议所有做类似方案的同行在第一块板子回样后先用示波器把MCLK、MIPI HS脉冲、桥接芯片的输出时钟抓一遍给自己建立一组基准波形。之后任何软件改动引起画面异常都能快速判断是软件配置漂了还是硬件本身就不稳。另外一个小技巧每次调好一版设备树用dtc把编译好的dtb反编译出来保存一份方便日后回溯。改设备树前也记得备份不要直接改SDK里的源文件。毕竟这种调试最怕的不是问题太复杂而是不知道上一次能出图的那版配置到底改了什么。
返回列表