Linux MIPI 调试中常见的问题

news2024/11/20 16:28:51

一、概述

做嵌入式工作的小伙伴知道,有时候程序编写没有调试过程中费时,之间笔记里有 MIPI 摄像头驱动开发的过程,有需要的小伙伴可以参考:Linux RN6752 驱动编写。而我也是第一次琢磨 MIPI 协议,其中有很多不明白的地方,在调试的时候折腾了很久,特此将我遇到的问题记录下来,希望多其他小伙伴有用。

二、测试环境

开发板:RV1126ARM Linux 版本:4.19.111MIPI 设备: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. index0index0

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

  • 无监测(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 获取到该信息后会触发复位操作。

  1. index1

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

  1. index2

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

  1. index3

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

  1. 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

  1. 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节点。各节点可独立采集。

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

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

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

  • 想直接从 CSI 模块位置直接获取数据,但是我尝试后,无法获取,如下图所示:

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

参考资料

  1. 介绍rk平台针对cif链路出现的mipi错误以及断流的复位操作:介绍rk平台针对cif链路出现的mipi错误以及断流的复位操作-CSDN博客

  2. camera调试:serdes camera调试:camera调试:serdes camera调试_人生苦短,我想躺平的博客-CSDN博客

  3. camera调试:RK3588 MIPI/DVP camera关键配置:camera调试:RK3588 MIPI/DVP camera关键配置-CSDN博客

  4. Rockchip Linux4.4 Camera Trouble Shooting 文档

文章转载自:浇筑菜鸟

原文链接:https://www.cnblogs.com/jzcn/p/17866409.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右&#xff0c;移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…

进程间通信2

3. system V-IPC 3.1 知识点 ipcs -a查看所有的ipc对象 在系统中他们都使用一种叫做 key 的键值来唯一标识&#xff0c;而且他们都是“持续性”资源——即他 们被创建之后&#xff0c;不会因为进程的退出而消失&#xff0c;而会持续地存在&#xff0c;除非调用特殊的函数或者…

带你手搓阻塞队列——自定义实现

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是——阻塞队列的自定义实现&#xff0c;通过自定义实现一个阻塞队列&#xff0c;可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章…

C++stack

目录 1.什么是stack 2.容器适配器 3.stack的使用 top push pop 4.模拟实现stack 1.什么是stack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。(后进先出) 2. stack是作为容…

进程间通信方式——管道

进程间通信方式——管道 1、管道2、匿名管道2.1 创建匿名管道2.2 进程间通信 3、有名管道3.1 创建有名管道3.2 进程间通信 4、管道的读写行为 原文链接 1、管道 管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质…

深入 C 语言和程序运行原理 实战项目代码在CentOS 7上编译

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 安装gtest 参考博客《使用gtest和lcov测试代码覆盖率》 wget https://github.com/google/googletest/archive/refs/…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日&#xff0c;中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了&#x1f4a5;我已经后悔了&#x1f62d;后悔没早点学习鸿蒙 HarmonyOS 概念&#xff0c;系统定位 1&#xff1a;鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统&#xff0c;它具有以下特别之处&#xff1a; 2&#xff1a;分布式架构&#xff1a;…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言&#xff1a; 今天&#xff0c;在互联网行业&#xff0c;超过30岁的工程师往往被认为是“码农”的生命周期终点。然而&#xff0c;华为鸿蒙系统的崛起&#xff0c;却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢&#xff0c;导致…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求&#xff1a; 默认一行展示4个卡片&#xff1b;当屏幕小于某个大小的时候&#xff0c;一行展示3个卡片&#xff1b;再小就展示2个&#xff1b;以此类推&#xff0c;最小就展示1个。 效果卡片样式如下图&#xff1a; 默认一行4个 屏幕缩小到某个阈值&#xff0c;一行展示…

11.26电梯控制器设计分析

项目三 电梯控制器设计&#xff08;*****&#xff09; 设计一个多楼层的电梯控制器系统&#xff0c;并能在开发板上模拟电梯运行状态。可以利用按键作为呼叫按键&#xff0c;数码管显示电梯运行时电梯所在楼层&#xff0c;led灯显示楼层叫梯状态。 就是初始默认在1楼&#xff0…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础&#xff08;卷积&#xff0c;池化&#xff0c;激活&#xff0c;全连接&#xff09; - 知乎 PyTorch 入门与实践&#xff08;六&#xff09;卷积神经网络进阶&#xff08;DenseNet&#xff09;_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…

Web 实时消息推送

Web 实时消息推送详解 什么是消息推送&#xff1f; 推送的场景比较多&#xff0c;比如有人关注我的公众号&#xff0c;这时我就会收到一条推送消息&#xff0c;以此来吸引我点击打开应用。 消息推送通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网&#xff0c;并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始&#xff0c;而是…