基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)

news2025/1/21 12:17:40

基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)

  • 名词定义
  • 视频格式
  • sensor与isp
  • I2C
  • XCLK
  • 行场同步信号
  • DATA
  • 抓图

名词定义

CIF,指RK芯片中的VIP模块,用以接收Sensor数据并保存到Memory中,仅转存数据,无ISP功能
DVP,一种并行数据传输接口,即Digital Video Port
HSYNC,指DVP接口的行同步信号
PCLK,指Sensor输出Pixel Clock
VSYNC,指DVP接口的场同步信号
V4L2,即Video4Linux2,Linux kernel的视频处理模块

视频格式

视频格式一般分成BT1120(BT656)和BT601两种。
BT1120视频数据只支持内同步。信号内同步的意思是图像数据和同步信号均包含在图像数据中,通过关键字恢复同步信号。可以参考我的另一篇博客SDI视频数据流格式简介
BT601协议采用外同步,外同步是指图像数据和同步数据(HS、VS、DE)单独传送。

因为内同步是将图像与同步信号一起传送,因此会有同步分离机制,所以亮度及色彩不可能全编码,以8BIT为例,可以传送的范围为0-255,但内同步一起传送,实际编码不可能有256范围,在ITU-656中大多采用16-235,而ITU-601因为采用外同步,可以传送0-255 范围的数据。因此,内同步的色采及亮度在细节上没有内同步好。但是,在串行编码及低带宽传送中,内同步可以减少数据流,因此,通过内同步传送图像虽然色彩有一定的损失,但可以换来更低的带宽。

视频格式一般在视频的驱动程序中进行设置,只有以下两种格式:

config->type = V4L2_MBUS_BT656;//BT1120 BT656
config->type = V4L2_MBUS_PARALLEL;//BT601

一般BT601使用较多,外同步信号,需要配合行场同步信号。

sensor与isp

sensor与isp之间的关系图一般如下所示:
在这里插入图片描述
首先ISP也就是ARM芯片端,需要通过I2C总线对sensor进行配置,主要通过SCL(时钟线)和SDA(数据线)对sensor的寄存器进行配置,可以决定sensor的分辨率、输出视频格式(rgb、yuv)、白平衡等进行设置。
部分摄像头可能不含晶振,比如OV7670,所以就需要ISP提供相机时钟,也就是XCLK进行驱动,一般在24MHz左右。部分带有晶振的相机,比如OV2640,由于集成了晶振,所以无需进行外部时钟驱动。
VS、HS和PCLK是sensor输出的行场同步信号和像素时钟。
DATA是sensor输出的像素值,一般8位较多。
然后对以上的各个部分进行介绍。

I2C

由于ARM芯片具有较多的I2C引脚,比如RV1126好像就有5个I2C引脚。每一个相机的I2C都要连接到对应的引脚上,以正点原子的RV1126开发板为例,I2C就挂载到了I2C1下:
在这里插入图片描述
在设备树dts中,就要把OV2640的摄像头节点放在I2C1下,比如:

&i2c1 {
	status = "okay";
	clock-frequency = <100000>;

    ov2640: camera@3c {
		compatible = "ovti,ov2640";
		pinctrl-names = "default";
		reg = <0x3c>;
		......
		}
	}

摄像头所支持的I2C时钟速度最快可达到400Kbps,同时每一款摄像头都有专属的地址,比如ov2640的地址是0x3c,注意地址是硬件设计死的无法更改。

I2C设备可以使用i2cdetect工具进行调试,比如查看i2c1下挂载了哪些设备,可以通过以下命令进行查看:

i2cdetect -y 1

若我在0x21处挂载了设备,将得到:
在这里插入图片描述
同时可以使用以下命令查看i2c寄存器中的值,比如我要查看i2c1下地址为0x3c处寄存器的值,可以通过以下名称查看:

i2cdump -y -f 1 0x3c

值得注意的是有些摄像头将power_down拉低后,开发板才能够通过i2c与相机寄存器之间进行通信,比如上方为拉低了的,下方为未拉低。
在这里插入图片描述
另:OV公司的I2C不是标准的I2C总线,为了避开专利,他们采用的是SCCB总线技术,不过经过测试与I2C区别不大。

SCCB是欧姆尼图像技术公司(OmniVision)开发的一种总线,应用于OV系列图像传感器上。SCCB最主要是阉割了IIC的连续读写的功能,即每读写完一个字节就主机必须发送一个NA信号。

XCLK

部分不带晶振的摄像头需要提供XCLK像素时钟进行驱动,在设备树中可以通过以下进行添加,注意时钟名字要与驱动对应:
比如设备树中可能如下:

	clocks = <&cru CLK_CIF_OUT>;
	clock-names = "xvclk";

驱动部分对应如下:

	priv->clk = v4l2_clk_get(&client->dev, "xvclk");
	if (IS_ERR(priv->clk))
		return -EPROBE_DEFER;

行场同步信号

不同相机的行场同步信号可能不同,具体可以查询芯片手册,不过注意的是芯片手册不一定准确,比如OV2640,芯片手册的时序为:
在这里插入图片描述
可以看出是标准的SDI格式,也就是当DE也就是HREF为高时,VSYNC为低,VSYNC只在有效像素前产生一段高电平。但是按照这个时序产生的同步信号始终无法抓取到图像,经过抓取之后发现OV2640输出的时序如下:

在这里插入图片描述
可以看出当DE为高时,也就是有效像素部分,VS也为高,基本与手册中写的相反,按照上面的时序即可抓取到图像。
正确OV2640时序的Verilog代码如下,注意分辨率为800x600,YUYV格式8bit:

parameter ROWS = 600;
parameter COLS = 1600;
parameter ROWS_TOTAL = 672;
parameter COLS_TOTAL = 3840;
parameter ROW_START = 36;
parameter COL_START = 1000;

reg [12:0] rROW;
reg [12:0] rCOL;

always@(posedge wCLK18M)
begin	
	if(!iRst)
	begin
		rROW <= 0;
		rCOL <= 0;
	end
	else
	begin
	   if(rCOL==COLS_TOTAL-1)
	   begin
	       rCOL <= 0;
	       rROW <= rROW + 1;
	   end
	   else
	   begin
	       rCOL <= rCOL + 1;
	   end
	   if(rROW == ROWS_TOTAL)
	   begin
	       rROW <= 0;
	   end 
	end
end
reg r2640DE;
reg r2640VS;
reg [7:0] r2640H;
always@(posedge wCLK18M)
begin	
    if(rROW >= ROW_START && rROW < (ROW_START + ROWS))
    begin
        r2640VS <= 1;
        if(rCOL >= COL_START && rCOL < (COL_START + COLS))
        begin
            r2640DE <= 1;
        end
        else
        begin
            r2640DE <= 0;
        end
    end
    else
    begin
        r2640VS <= 0;
    end
end

生成的波形如下:
在这里插入图片描述

同时也要注意HS和VS的极性,也就是有效时的电平高低,主要收到设备树和驱动的控制,设备树部分如下:

		port {
			cam_para_out1: endpoint {
				remote-endpoint = <&cif_para_in>;
				bus-width = <8>;
				hsync-active = <1>;//***
				vsync-active = <1>;//***
				pclk-sample = <1>;
			};
		};

驱动部分:

config->flags = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER |
		V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH |
		V4L2_MBUS_DATA_ACTIVE_HIGH;

两者要与实际情况相匹配。

DATA

sensor输出的数据一般8位居多,也有16位和10位的,RV1126的CIF接口输入如下:
在这里插入图片描述
优先使用CIF接口的高位进行传输。
同时还要对MEDIA_BUS_FMT进行配置,与sensor输出的像素格式对应,可以参考V4L2的手册,格式十分丰富。
以OV2640为例支持以下的格式:

static u32 ov2640_codes[] = {
	MEDIA_BUS_FMT_YUYV8_2X8,
	MEDIA_BUS_FMT_UYVY8_2X8,
	MEDIA_BUS_FMT_YVYU8_2X8,
	MEDIA_BUS_FMT_VYUY8_2X8,
	MEDIA_BUS_FMT_RGB565_2X8_BE,
	MEDIA_BUS_FMT_RGB565_2X8_LE,
};

以MEDIA_BUS_FMT_YUYV8_2X8为例,视频输出的格式位YUYV,并且深度是8bit色深,每次只传输8bit,两个像素周期才是一个完整的像素。

抓图

抓图一般使用v4l2-ctl进行抓图,对于dvp接口可以在video0进行抓图,对于mipi则不行,抓图实例如下:

v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=YUYV8_2X8--stream-mmap=3 --stream-skip=3 --stream-to=./cif.out --stream-count=1 --stream-poll

抓图成功一般如下所示,会有 < 打印输出:
在这里插入图片描述
并且对于800x600大小YUYV8_2X8格式的图片一般占用940k存储空间。
并且可以通过以下python代码查看像素值:

yuv = "./pic.out"
with open(yuv, "rb") as yuv_f:
    yuv_bytes = yuv_f.read()
    yuv_data = np.frombuffer(yuv_bytes, np.uint8)

同时在/proc路径下也会有统计信息得到保存,通过以下命令进行查看:

cat /proc/rkcif_dvp

在这里插入图片描述
以上就是对dvp相机的视频接入的简单介绍,各位有疑问可以留言,进行交流。

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

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

相关文章

Komo 综合资产收集和漏洞扫描工具

前言 因工作中的需要&#xff0c;开发了这款综合资产收集和漏洞扫描工具&#xff0c;方便在工作中各方面的收集资产和漏洞扫描&#xff0c;同时也可用于挖洞。 Komo已经在工作中辅助我挖到过一些漏洞&#xff0c;同时轻便了我资产收集的过程。 Komo is a comprehensive asset c…

【图像处理OpenCV(C++版)】——3.3 几何变换之极坐标变换

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

MATLAB | 如何从热图中提取数据

这期做了个可能有用的小工具&#xff0c;一般论文中热图很少给出数据&#xff0c;于是就想写个小工具通过热图上的颜色估计出数据值来&#xff0c;目前写了个初版的工具分享给大家&#xff01; 工具函数 由于只是初版&#xff0c;要手动改的地方还是不少的&#xff0c;要设置…

PHP多商户AI智能在线客服系统源码 机器人自动回复 即时通讯聊天系统源码

一套智能在线客服系统源码 多商户网页客服系统源码 支持二十种国际语言 带机器人自动回复。 框架&#xff1a;Thinkphp5workerman&#xff0c; 环境&#xff1a;nginxphp7.3mysql5.6 支持H5公众号APP小程序 了解更多可私信我&#xff01; 系统功能&#xff1a; 1、支持国际…

编写程序时调用第三方程序时使用的是相对路径而不是绝对路径会造成什么严重后果(Windows Linux)

简介 在编写程序时&#xff0c;有很多人调用第三方程序使用的是相对路径&#xff0c;而不是绝对路径&#xff0c;如下&#xff1a; #!/bin/python3import osos.system("whoami") #调用whoami程序&#xff0c;查看当前用户名#!/bin/bashfind / -name "hellowor…

day10|239. 滑动窗口最大值、347.前 K 个高频元素

239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3…

如何修改视频MD5的格式?这些方法值得你收藏

MD5实际上是计算机安全领域中广泛使用的一种散列函数&#xff0c;可以用来保护消息的完整性&#xff0c;简单来说就是类似于我们的指纹&#xff0c;可以说MD5是每个文件的“数字指纹”。比如&#xff1a;我们在平台上传一些热门视频&#xff0c;平台会自动识别视频的MD5值&…

嵌入式 LINUX 驱动开发 day01 第一个内核模块程序 多文件编译为一个程序, 内核模块参数, 内核模块依赖

1.第一个内核模块程序 ( 记得配置自己的交叉编译的工具,) 首先两个文件 vser.c Makefile (记得大写的M) vser.c #include <linux/init.h> //内核初始化头文件 #include <linux/module.h> //内核模块文件 #include <linux/kernel.h> //&…

Java基础算法每日5道详解(6)

112. Path Sum 路径总和 Given the root of a binary tree and an integer targetSum, return true if the tree has a root-to-leaf path such that adding up all the values along the path equals targetSum. A leaf is a node with no children. Example 1: Input: ro…

html+css实现一个响应式管理平台架构模板

文本将会带你使用htmlcss实现一个响应式的管理平台架构模板&#xff0c;目前来说市面上的管理平台架构模板大同小异&#xff0c;文本的知识点都会符合场景所需。 目录 1、管理平台的架构内容 2、顶部的布局 3、下半部分布局 4、左侧菜单区域实现 5、右侧主体区域实现 …

前端重新部署如何通知用户刷新网页?

我把我掘金的文章同步一份给CSDN 1.目标场景 有时候上完线&#xff0c;用户还停留在老的页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时候有时候js连接hash变了导致报错跳不过去&#xff0c;并且用户体验不到新功能。 2.思考解决方案 如何去解决这个问…

顶象助力绿球金科打造App低碳出行场景

“低碳出行”、“碳中和”、“碳惠普”正在成为近几年的科技热词之一。 自2020年9月&#xff0c;中国向世界许下“力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和”的承诺以来&#xff0c;一场围绕绿色节能、低碳减排的变革正在席卷各行各业。 “碳中和”已经成为时代…

如何让SCI期刊审稿人,理解你的文章? - 易智编译EaseEditing

首先需要对论文进行全文润色 对于发表论文来说&#xff0c;进行润色是必须的&#xff0c;正因为SCI论文翻译要求高难度大&#xff0c;无论笔译还是口译都一定要有过硬的基本功&#xff0c;知识面要足够宽广&#xff0c;专业综合能力要求高。 所以当一篇论文的整体结构不到位&…

凯恩帝机床联网

一、设备信息确认 1、确认型号 数控面板拍照确认&#xff1a; 此系统为&#xff1a;K1TCi 注&#xff1a;凡是系统中带i的&#xff0c;基本上都含网口。 2、确认通讯接口 网口常见位置&#xff0c;XS92&#xff08;丝印标号&#xff09;&#xff0c;可通过这个确认&#x…

PnetLab模拟器安装锐捷镜像

安装准备&#xff1a; 1.安装完成pnetlab&#xff0c;这里不过多叙述&#xff1b; 2.在锐捷的网站下载好模拟器镜像&#xff08;目前只支持Switch和Router&#xff09;&#xff0c;下载地址&#xff1a;https://www.ruijie.com.cn/fw/wd/88899/ 官网下载后的内容包括下面几个…

Linux umount报错:device is busy

执行nfs卸载命令umount /mnt&#xff0c;报错target is busy. 或device is busy可以按以下步骤检查&#xff1a;退出要卸载挂载的目录&#xff0c;再执行卸载挂载cd ../umount /mnt找出占用目录的端口&#xff0c;kill端口fuser -m /mnt/kill -9 端口umount /mnt停止nfs服务&am…

计算机基础——操作系统

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.操作系统 1.操作系统简介 2.操作系统的主要功能 &#xff08;1&#xff…

【Kotlin】字符串操作 ② ( 字符串替换函数 replace | 字符串比较操作符 == 和 === | 字符串遍历 forEach )

文章目录一、字符串替换函数 replace二、字符串比较操作符 和 三、字符串遍历 forEach一、字符串替换函数 replace 字符串替换函数 replace 函数原型如下 : /*** 返回一个新字符串&#xff0c;通过替换此字符序列中匹配给定正则表达式的每个子字符串获得* 用给定的[替换]。**…

一个芯片工程师的ADC学习笔记 (二)

众所周知&#xff0c;ADC主要用于对模拟信号进行数字采集&#xff0c;以进行数据处理。我们周围的信号一般都是不断变化的模拟量&#xff0c;如光、温度、速度、压力、声音等。然而&#xff0c;我们大多数人都使用数字设备。如果我们想方便地使用和处理信息&#xff0c;就需要将…

【机器学习】关联规则挖掘算法 + 三大案例实战 + Apriori算法 + Python代码实现

文章目录一、关联规则概述1.1 关联规则引入1.2 关联规则相关概念介绍1.2.1 样本、事务、项集、规则1.2.2 支持度、置信度1.2.3 提升度1.2.4 所有指标的公式二、Python实战关联规则2.1 使用 mlxtend 工具包得出频繁项集与规则2.1.1 安装 mlxtend 工具包2.1.2 引入相关库2.1.3 自…