一、概述

做嵌入式工作的小伙伴知道,有时候程序编写没有调试过程中费时,之间笔记里有 MIPI 摄像头驱动开发的过程,有需要的小伙伴可以参考:Linux RN6752 驱动编写

而我也是第一次琢磨 MIPI 协议,其中有很多不明白的地方,在调试的时候折腾了很久,特此将我遇到的问题记录下来,希望多其他小伙伴有用。

二、测试环境

开发板:RV1126

ARM Linux 版本:4.19.111

MIPI 设备:RN6752V1

摄像头:AHD 摄像头

三、调试中的问题

在调试需要先确定摄像头驱动是否已经正常加载,可以使用命令 media-ctl -p -d /dev/mediaX 进行查看,如下图所示:

其次明白怎么获取自己的图片,如果直接编写应用程序进行测试的,那无意增加了调试的难度,所以在测试之前需要只要抓图的命令,如果多抓图和链路关系还不了解的小伙伴,可以看我之前的笔记:Linux Media 子系统链路分析

注意: 这里我使用的测试模块是 RN6752V1,它从米皮出来的数据已经是 YUV422 格式的图像,所以我抓取的节点可以有不一样的地方。

1. 抓图时出现 select timeout 错误

现象:出现这样错误的可能原因是因为,MIPI 设备没有正常工作,错误如下图所示

解决办法:

  • 比如在驱动用没有正常调用留控制函,并通过 I2C 对设备进行配置
  • 确定芯片的睡眠引脚电平是否正常
  • 可以使用示波器观察 MIPI 通道时候存在数据,如下图所示



    注意 如果将图像缩小,可以看到每帧数据之间有一定的间隔时间,如果芯片正常工作后,便可以抓取到图像。

2. 帧错误

现象:抓图中会出现 rockchip-mipi-csi2: ERR1: error matching frame start with frame end, reg: 0x10,cnt:2 提示。

解决办法:这一般都是硬件不稳定导致的,需要检查硬件上的问题

3. 帧格式错误

现象:抓图时,有时能正常抓取成功,但是偶尔会提现是 rkcif_mipi_lvds: ERROR: csi bandwidth lack, intstat:0x80002!! 错误,出现此错误后,变无法获取图像。

解决办法:出现这个问题多数情况是帧格式不匹配导致的,比如我在驱动中使用的是 MEDIA_BUS_FMT_UYVY8_2X8,而抓图是却用的 NV12,也有人说是瑞芯微中使用 NV12 的问题,只需改为 NV16 即可,这类我抓图时更改为 uyvy422 就没有这个错误了。

4. 干扰错误

现象:当数据通道被干扰后,会提示 rockchip-mipi-csi2: ERR1: crc errors, reg: 0x1000000, cnt:1 错误

解决办法:这个是有硬件不稳定导致的,不过一般出现这个错误也是能正常抓取图片的。

5. 瑞芯微 VI 模块使用

现象:由于 RN9752V1 模块接入 MIPI 同到的信号是 YUV422 格式的图像,所以不需要经过 ISP 模块,只需要在 CIF 节点获取即可,但是使用 VI 模块从 video0 节点获取图像是失败。

解决办法:失败的原因是因为 VI 模块默认从 DMA 中获取数据,而 CIF 是从内存中转存的,所以需要将 VI 模块的数据源改为从内存中获取,如下图所示:

6. 图像分屏问题

现象:当 MIPI 通道受到干扰时,便会出现分屏问题,复现也很简单,只需要对 MIPI 通道的数据线或时钟线进行干扰即可分屏,并且每次分屏的位置都不同,如下图所示

解决办法:这里存在两种情况

  • 启动时分屏,当设备启动时分屏,这样的情况是因为获取图片之前没有对设备进行复位(可能软复位和硬复位都要执行),RN6725V1 的复位如下图所示:

  • 运行时分屏,当图像正常运行后,收到硬件部分的干扰也会导致分屏,这样的现象只需要增加 CIF 通道的异常检测功能即可,添加方法如下图所示,具体的操作见VICAP 异常复位部分的分析,

注意: 以上是我遇到的一些错误,更多的问题处理见 Rockchip Linux4.4 Camera Trouble Shooting 文档,路径在RV1126参考资料\Linux\Camera 目录下

四、VICAP 异常复位

瑞芯微已经在驱动中增加了异常复位功能,只需要开启异常检测功能即可,需要注意的是,不同板子的开启方式不同,比如 RK3588 是在配置信息中开启,在 drivers\media\platform\rockchip\cif 目录下的Kconfig文件中定义相应的信息,如下图所示:

由于我使用的是 RV1126 开发板,所以这里重点介绍 RV1126 中的配置,而 RV1126/RV1109 都是通过设备树进行配置的,配置信息如下所示:

rockchip,cif-monitor = <index0 index1 index2 index3 index4>;
  1. index0

    index0 表示的是复位模式,目前主要有四种模式

    • 无监测(idle):默认开启,若无 rockchip,cif-monitor 节点配置时,默认为无检测模式,VICAP 不进行图像异常监测
    • 连续模式(continue): 用于实时监测 vicap 是否 mipi 出错及断流,当发生出错及断流时进行 vicap 复位。

      检测方式是定时器在 index1 设定的帧数达到时,在帧位进行初始化并开始监测,若出现错误达到相应的帧数后触发复位。

      定时器以 index2 设定的周期数进行检测
    • 触发模式(trigger):只有在 csi2 协议层出现了错误时才会触发,当 index4 设定的次数达到时,在图像的帧尾初始化触发器,并在 index2 设定的周期数达到后进行一次 vicap 复位
    • 热插拔模式(hotplug):主要针对车机转接芯片,用于解决设备插拔是图像隔离或断流的问题,此模式具备“连续模式”的功能,与 continue 的差别在于,在 mipi 不报错和不断流的情况下,若是 vicap 所采集的 sensor 通过

      RKMODULE_SET_VICAP_RST_INFO 命令置位复位使能,那么 vicap 在通过 RKMODULE_GET_VICAP_RST_INFO 获取到该信息后会触发复位操作。
  2. index1

    对 continue 或者 hotplug 而言,在采集到 index1 帧数据后,触发监测定时器

  3. index2

    监测定时器的周期,以一帧为单位,监测周期为 index2 帧;

  4. index3

    延时复位的时间参数,在发现 vicap csi2 报错后,在该定义时间内,持续对监测,当检测到错误不再增加,进行复位,超过该定义时间,不管是否还在增加错误,都立即进行复位操作,时间单位ms

  5. index4

    用于设定 mipi csi err 的出现次数,在达到该次数后,触发复位

注意: 在 VICAP 模块中产生复位后,是不能解决分屏的问题,它的主要目的是监测图像是否错误,并触发复位信号,复位信号产生后,会在驱动程序的控制函数中产生 RKMODULE_SET_QUICK_STREAM 控制信号。然后利用这个复位信号对设备进行复位便可解决分屏的问题,如下图所示:

五、CSI 数据流模块

  1. CSI 同时采集

    在 RV1126 和 RV1106 中,存在两个独立而完备的标准物理mipi csi2 dphy,对应于dts上的csi_dphy0和csi_dphy1,所以我们可以实现两个摄像头同步进行图像采集。但是 RV1126 中只有一个 14M 的 ISP 模块,所以想实现两个同时采集只能通过下面两条路径才能实现,但是两张图像不能超过 14M。

    imx335-----csi_dphy0------csi2----cif----isp0------ispp0
    imx335----csi_dphy1----isp1---ispp1

    注意: 在 RV1126 中,ISP只能达到 30fps

  2. cif 模块

    在 RV1126/RV1109 中,VICAP存在两个IP核,其中一个称之VICAP FULL,一个称之VICAP LITE,

    • VICAP FULL:拥有dvp/mipi/lvds三种接口,dvp可与mipi或者lvds接口同时工作,而mipi和lvds则不能同时工作,VICAP LITE 仅拥有lvds接口,可与VICAP FULL的接口同时工作。
    • VICAP LITE: 仅拥有lvds接口,可与VICAP FULL的接口同时工作。

    注意: VICAP FULL dvp接口对应一个rkvicap_dvp节点,VICAP FULL mipi/lvds接口对应一个rkvicap_mipi_lvds节点,VICAP LITE 对应一个rkvicap_lite_mipi_lvds节点。各节点可独立采集。

  3. YUV 数据双通道采集问题

    从上面信息可以可知,对于 MIPI 通道中的数据是 RAW 格式的,便可以实现两个通道同时采集,但是对于 MIPI 通道中的数据是 YUV 格式时,我只实现一个摄像头的数据采集,分析如下

    • 因为 CIF 模块和ISP通道之间是通过虚拟连接的,也就是数据是通过内存块进行交换的,所以可以直接通过这个内存控件直接抓取图像,也就是 vide0 ~ vido3 这几个节点,但是 CIF 模块只有一个,不能用这样的思想进行双通道采集。
    • 想直接从 CSI 模块位置直接获取数据,但是我尝试后,无法获取,如下图所示:

    注意: 因为无法在 ISP 模块之前获取 MIPI 通道的数据,所以我没能实现 RV1126 同时采集两个 RN6752V1 的图像数据,但是理论上应该是可以实现的,但是我没找到合适的方式,望有知道的大佬指点一下,如果后期我发现解决办法后,也会补充上的。

参考资料

  1. 介绍rk平台针对cif链路出现的mipi错误以及断流的复位操作:https://blog.csdn.net/weixin_42851620/article/details/131194884
  2. camera调试:serdes camera调试:https://blog.csdn.net/qq_34341546/article/details/129138301
  3. camera调试:RK3588 MIPI/DVP camera关键配置:https://blog.csdn.net/qq_34341546/article/details/128907000?spm=1001.2014.3001.5502
  4. Rockchip Linux4.4 Camera Trouble Shooting 文档

Linux MIPI 调试中常见的问题的更多相关文章

  1. Linux提权中常见命令大全

    在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 root 权限,拿在进行 Linux 提权的 ...

  2. JS 调试中常见的报错的解决办法

    报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) ...

  3. 云服务器 ECS Linux 系统中常见的日志文件介绍

    云服务器 ECS Linux 系统中,日志文件是非常重要的文件,它们记录了很多系统中重要的事.Linux 系统中常见日志文件概述如下: /var/log/cron可以在 cron 文件中检查 cron ...

  4. 在linux命令行中调试在OJ上的c++代码

    gcc & g++现在是gnu中最主要和最流行的c & c++编译器 .g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可. 编译器是根据gcc ...

  5. 远程调试在Linux车机中的应用

    导读 在软件开发过程中,调试是必不可少的环节,嵌入式操作系统的调试与桌面操作系统的调试相比有很大差别,嵌入式系统的可视化调试能力比桌面操作系统要弱一点.对于导航这种业务场景比较复杂的程序开发,可视化调 ...

  6. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  7. Linux与Windows中动态链接库的分析与对比

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系 ...

  8. 【转】Linux内核调试方法总结

    目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_sta ...

  9. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

  10. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

随机推荐

  1. Cilium系列-15-7层网络CiliumNetworkPolicy简介

    系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略 ...

  2. 一文读懂LockSupport

    阅读本文前,需要储备的知识点如下,点击链接直接跳转. java线程详解 Java不能操作内存?Unsafe了解一下 LockSupport介绍 搞java开发的基本都知道J.U.C并发包(即java. ...

  3. Oracle-21C导入dmp文件

    1.前期工作 具体参考该博文 Windows操作系统安装Oracle数据库 下载安装Oracle数据库图形管理工具 2.连接和调整数据库环境 2.1.以数据库管理员身份登录数据库 ++++++++++ ...

  4. shell编程之存储读写测试实战脚本

    Shell编程是一种在命令行环境中编写程序的技术,常用于Linux和Unix系统.它主要使用Shell脚本语言来编写程序.Shell编程常用于系统管理.自动化任务.批处理等领域. 常用的Shell脚本 ...

  5. 《CTFshow-Web入门》02. Web 11~20

    @ 目录 web11 题解 原理 web12 题解 web13 题解 web14 题解 web15 题解 web16 题解 原理 web17 题解 web18 题解 原理 web19 题解 web20 ...

  6. 别再用 offset 和 limit 分页了,性能太差!

    不需要担心数据库性能优化问题的日子已经一去不复返了. 随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现. 作为开发人员,我们要不断地打 ...

  7. Nomad系列-Nomad网络模式

    系列文章 Nomad 系列文章 概述 Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Cons ...

  8. Hugging News #0912: Hugging Face 2 人入选时代周刊全球百大 AI 人物

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  9. dedebiz发布文章自动提交到百度搜索的方法

    修改程序文件 依次打开/admin/article_add.php和article_edit.php 找到ClearMyAddon($id, $title); 在其上面加入 //自动提交到百度 els ...

  10. ISIS 协议常用基本配置总结

    转载请注明出处: 1.创建IS-IS进程,进入IS-IS进程 [Huawei] isis [process-id ] 参数process-id用来指定一个IS-IS进程.如果不指定参数process- ...