基于AXI模块的视频流传输(ps控制篇)

news/2025/10/6 22:58:32/文章来源:https://www.cnblogs.com/hanhuang/p/19128032

在生成VDMA,GPIO,IIC后,会生成对于的bsp板级包。这里我不打算进行深入学习(不会尝试自己去写这份ps代码),要求能较为深入理解ps工作的原理即可,依旧不去细看HDMI模块相关。
image
首先导入了几个库,然后定义了几个宏,这里有一个要注意的,define这里有的根据英文意思就能知道分别对应什么功能,但是#define VGA_VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID中,需要看自己生成的VDMA(传给HDMI的通道)是编号0还是编号1,这里VGA实际上指的是HDMI,要把编号对上。下面四个define并没有被引用,因此作用我没去探究。

接下来就是几个结构体变量的声明,
image
基本都是类似这样,这个指针指向的还有点泛,结构体下还有结构体变量,但是大致意思能知道就行。都有英文解释的。然后就是声明两个数组,第一个是用于存储三个帧图像,第二是指针数组变量。
image
简单说一下这部分,DISPLAY_NUM_FRAMES是3,意味着有三帧缓冲,而由于我c语言很多都忘记了,所以这里插入两道指针题目:
image
这是利用指针修改数据
image
这是指针数组打印,值得一提的是,指针数组在作为参数引入函数时,不需要&符号,就会传递指向第一行的地址,然后函数接收时,由于接收来自第一行的指针变量,但是实际上数组每行有三个元素,因此传递时还是需要[3]作为后缀。理解不了也没事不影响。
然后pFrames[i] = frameBuf[i];相当于指向第i行的数据被赋值为右边的数组,这里也需要注意,等号右边的数组是不需要解引用*的。然后memset就是【指向的基地址,赋值,大小】,所以这样看会发现这三帧图像的数据都被设置为0。接下来是DCacheFlush,由于DDR3内存量过大,因此CPU一般访问DDR3时,会顺手把这个数据放在Cache上,缓存离CPU比较近,所以访问快,这是一个提高效率的方法,如果CPU要写入什么数据,也会先把数据写到缓存,然后后面如果CPU对同个地址再次写入,就会把原来的数据挤压到DDR3里面,然后缓存就存储新数据。这是一种常见的加速,但是会导致如果其他主机访问DDR3的数据,就可能这个数据还在缓存上没更新,所以这里需要缓存冲刷,将缓存上的数据更新到DDR3上,因为DDR3要被VDMA读取。
i2c_init(&ps_i2c0, XPAR_XIICPS_0_DEVICE_ID,40000);我觉得应该和串口很像,串口的话有一个Tx_BUF,往这个寄存器写入数据串口就会以串口协议发送这个1字节的数据,因此协议是硬件上实现的,然后我看了IIC.c和.h文件,发现也都是往寄存器写入数据的函数或者读取,所以我猜对了。但是这里是初始化,和配置iic还不一样。我们深入看一下代码:
image
主函数传入了一个空的iic结构体,ps端生成的iic0的ID,以及40000。可以发现该函数借助这个ID找到了iic0的配置这一结构体(Lookup函数)
image
可以发现这个函数只是简单的返回一下iic的配置config。然后就进入XIicPs_CfgInitialize(Iic, Config, Config->BaseAddress);函数了,点进去稍微看一下,不难发现它在把config的各个变量全部交给iic,可是由于iic的变量名和config不一样,所以更细节的东西不了解,只是知道config把它的配置,基地址啥的全部告诉了iic指针。相当于说,这个函数让iic指针成为我们IIC0设备的新词根我们可以直接拿来用它内部的结构体。
接下来就是setclk,这个姑且理解为设置为40KHz时钟吧(由传入参数决定),然后就是wait到iic空闲即可返回。
image
接下来是gpio,由前面的能知道,这里的初始化,实际上是将设备名称ID的结构体往新建的指针变量上代入,所以我们只要知道后面根据这个新结构体指针cmos_rstn就能控制这个gpio就行。
由于gpio是inout通道,要先配置好,XGpio_SetDataDirection(&cmos_rstn, 1, 0x0); 是往一号通道写入0,gpio可以设置为双通道,所以用1,2来编号,0是输出,1是输入。后面就是简单的往1号通道写入1,然后等一会,写入0,等一会,写入1开启cmos即可。
sensor_init(&ps_i2c0);由于我们前面知道i2c_init函数以及将XPAR_XIICPS_0_DEVICE_ID对应的各参数给了ps_i2c0结构体指针,并且配置了时钟频率为40KHz,这里比较简单,直接看
image
sensor_init就是往iic指针里面的各个地址写入各个数据来配置cmos,看一下他们的递进关系从底层开始:iic_reg16_write->ov5640_write->sensor_write_array->sensor_init
image
传入一个指针结构体,iic的地址,以及iic内部寄存器的地址和要写入的数据。
image
ov5640_write只是简单调用一下,不过iic地址写为3c这里我也不理解,可能在数据手册里,等我后面看看。然后就是sensor_write_array函数,也都比较简单,顶层也只是调用这个函数,看一下知道怎么用结构体指针实现即可。
vdmaConfig = XAxiVdma_LookupConfig(VGA_VDMA_ID);这个更是演都不演了,直接在主函数调用,就是找到VGA对应VDMA的配置然后传给vdmaconfig,XAxiVdma_CfgInitialize(&vdma, vdmaConfig, vdmaConfig->BaseAddress);也是一样,把这个vdma的所有信息全部传给vdma指针。
Status = DisplayInitialize(&dispCtrl, &vdma, DISP_VTC_ID, DYNCLK_BASEADDR,pFrames, DEMO_STRIDE);这个的话就只是把对应的信息传给dispctrl指针结构体而已。
image
就只是把这些信息配置好而已。为HDMI显示部分不做赘述。只知道是用来配置vtc,mmcm,对应vdma的即可。
然后就是DisplayStart(&dispCtrl);是为了让他们协调工作把视频流输出。
memset(dispCtrl.framePtr[dispCtrl.curFrame], 0, 1920 * 1080 * 3);这里发现将dispctrl(HDMI显示相关)的帧指针下的当前指针全部清0了,应该是再加一层保障吧,由于前面清0过了我觉得无所谓这个函数。
最后开始开启视频流→DDR3的VDMA:vdma_write_init(XPAR_AXIVDMA_1_DEVICE_ID,1280 * 3,720,1280 * 3,(unsigned int)dispCtrl.framePtr[dispCtrl.curFrame]);这个就是上一节提到的,把这些参数给VDMA它会更好的布局然后传给DDR3至于为什么要乘3,是因为3字节。配置的东西,直接调用即可,然后你会发现这里好像并没有给VDMA配置3个缓冲帧,可以初步判断应该是在硬件上去配置,就是在VDMA上设置三个缓冲帧(两个都要),然后记得初始化3个帧的空间即可。

再接再厉!

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

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

相关文章

lora的各种变体

lora的各种变体:lora+:对A(靠近输入端)和B(靠近输出端)设置不同的学习率以加速收敛,对B的学习率通常是A的4到16倍,这是因为近输出层的梯度更加稳定,近输入层的梯度相对不稳定,如果设置的学习率过大,容易梯度…

GO+RabbitMQ+Gin+Gorm+docker 部署 demo - 实践

GO+RabbitMQ+Gin+Gorm+docker 部署 demo - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

k8s pod启动失败困难排查

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python测试

今日内容pycharm安装 git 版本控制 -- 协同开发 码云 -- 远程仓库 思维导图 个人博客 -- 技术人员昨日回顾typora 安装 使用标题 有序序号 无序序号 加粗 斜体 删除线 插入图片 插入表格 代码块、python的简介python2和…

免费文字转语音 AI 工具 All In One

免费文字转语音 AI 工具 All In One free TTS to Audio AI Tools TTSMaker 免费文字转语音免费文字转语音 AI 工具 All In Onefree TTS to Audio AI ToolsTTSMaker 免费文字转语音 每周限制 20000 个字符(部分声音可支…

Kubernetes Deployment:部署与管理应用指南

1. ReplicaSet(RS) 2. Deployment 3. Deployment资源配置 总结‍在上一章节中,介绍了pod,以及介绍了如何使用命令行来创建一个pod。那么问题来了,一般来说,我们部署微服务不可能只部署一个噻,肯定是部署多个,但…

wordpres做影视网站公关策划书模板范文

宏定义 不带参数 宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符 字符串其中的标识符就是所谓的符号常量,也称为“宏名”。 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。 掌…

实用指南:Android高级开发第三篇 - JNI异常处理与线程安全编程

实用指南:Android高级开发第三篇 - JNI异常处理与线程安全编程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

商城网站设计公司系统优化包括哪些

作者推荐 视频算法专题 本文涉及知识点 哈希映射 哈希集合 LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复 RandomizedCollection 是一种包含数字集合(可能是重复的)的数据结构。它应该支持插入和删除特定元素,以及删除随机元素。 实现 Randomiz…

判断网站开发语言wordpress 访问速度

来源:德先生作者:朱圆恒,唐振韬,李伟凡,赵冬斌北京时间2019年1月25日2时,DeepMind在伦敦向世界展示了他们的最新成果——星际争霸2人工智能AlphaStar[1] 。图1. DeepMind AlphaStar挑战星际人类职业玩家直播…

分布式CAP理论 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【闲话】2025.9.24 记梦

破碎,离奇。话说 \(9.25\) 吃了 \(hz\) 校庆期间 \(hs\) 食堂免费饭菜的人第二天都被抓去做黑工,我和 @wkh2008 因为当时润去不知道干什么了所以没有被抓走,第二天回到班里发现毫无人,然后被学校里巡游的中介带走。…

北京撒网站设计git网站开发

文章目录 目录1. 程序的翻译环境和执行环境2. 详解编译链接2.1 翻译环境2.2 编译本身也分为几个阶段2.3 运行环境 3. 预处理详解3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##3.2.5 带副作用的宏参数3.2.6 宏和函数…

完整教程:Postgresql常规SQL语句操作

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方式

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

拼多多电商网站建设学校网站建设方案设计

使用 services 指令,请先安装 brew tap gapple/services 安装完成后使用 brew services start mysql

关于网络编辑作业做网站栏目新闻的ppt免费网站软件大全

今年有哪些成功的发行版发布呢? 让我重点介绍最好的几个。 这些发行版在 2023 年引起了人们的关注! 每年我们都会推出一些令人兴奋的新发行版,它们尝试以不同的方式工作,或者提供一些有意义的东西,而不仅仅是“又一个发…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Cloudflare洛杉矶数据中心维护通知:技术架构与影响解析

本文详细介绍了Cloudflare将于2025年10月8日在洛杉矶数据中心进行的计划性维护,包括维护时间窗口、流量重路由机制、潜在延迟影响,以及针对PNI/CNI客户的重要技术建议和通知订阅方式。维护概览 计划维护时间:2025年…

正规的手机网站建设小程序官方平台

等到花都谢了,你怎么还不开机?这电脑开机真是离奇的慢,有心将它换了,奈何兜里空空。凑合着用又无法忍受这种煎熬。其实你只需要用鼠标点几下就可以不用等待这漫长的开机过程了。高铁,飞机,网络,…