基于zynq在linux下的HDMI实战

ZYNQ系列文章目录

第一章:基于zynq在linux下的phy调试记录
第二章:qemu制作ubuntu文件系统
第三章:基于zynq在linux下的AXI-CAN实战
第四章:基于zynq在linux下的HDMI实战



前言

记录zynq调试:

从petalinux的搭建,到uboot、kernel、rootfs的适配、移植、SDK构建及优化


提示:以下是本篇文章正文内容,下面案例可供参考

一、vivado中HDMI的配置

基于4.14的内核适配HDMI,无需进行内核驱动的修改,全程无缝替换。
但是基于5.10因为DRM整个框架的改动,相关IP核的驱动需要修改。

1.1 IP核准备

需要两个关键性的得捷IP核,点击直接下载
RGB TO DVI
DYNAMIC CLOCK

1.2 vivado Diagram配置

首先将1.1中准备好的2个IP核放入指定目录,然后导入至vivado中

在这里插入图片描述

Diagram配置如下

在这里插入图片描述

XDC中TVDS及HDMI-IIC自行根据个人硬件IO进行配置 建议直接在菜单导航栏中点击该选项中的 “Open Elaborated Design ”。然后在菜单栏中点击 Layout ,在下拉列表中选择 I/O Planning 以打开 I/O Ports 窗口。我们将在 I/O Ports 窗口中对hdmi-iic、tmds 引出的接口进行管脚分配。

在这里插入图片描述

保存后会自行生成XDC

在这里插入图片描述

最后点击Generate Bitstream生成system.bit

1.3 SDK配置

1、使用fsbl官方例程生成fsbl.elf,给petalinux生成BOOT.BIN使用。
2、生成pl.dtsi,给内核中设备树当头文件使用
在这里插入图片描述
在这里插入图片描述

二、petalinux中HDMI的配置

2.1 内核驱动准备

clk-dglnt-dynclk.c
digilent_encoder.c

2.2 内核驱动添加

将2.1中两个驱动文件分别放入/kernel/drivers/gpu/drm/xilinx/及kernel/drivers/clk中
在这里插入图片描述
下一步进行digilent_encoder.c的修改
先修改/kernel/drivers/gpu/drm/xilinx/kconfig 在最后一行加上

config DRM_DIGILENT_ENCODER
	tristate "Digilent VGA/HDMI DRM Encoder Driver"
	depends on DRM_XILINX
	help
	  DRM slave encoder for Video-out on Digilent boards.

在这里插入图片描述
修改/kernel/drivers/gpu/drm/xilinx/makefile 添加相关源码编译链接

obj-$(CONFIG_DRM_DIGILENT_ENCODER) += digilent_encoder.o

在这里插入图片描述
开始进行clk-dglnt-dynclk.c的修改
先修改/kernel/drivers/clk/kconfig ,其中加上

config COMMON_CLK_DGLNT_DYNCLK
	tristate "Digilent axi_dynclk Driver"
	depends on ARCH_ZYNQ || MICROBLAZE
	help
	---help---
	  Support for the Digilent AXI Dynamic Clock core for Xilinx
	  FPGAs.

在这里插入图片描述
修改/kernel/drivers/clk/makefile ,其中加上

obj-$(CONFIG_COMMON_CLK_DGLNT_DYNCLK)	+=	clk-dglnt-dynclk.o

在这里插入图片描述

2.3 内核配置

kernel目录终端执行

make menuconfig ARCH =arm CROSS_COMPILE=arm-linux-gnueabihf

配置xiilinx自己的DRM驱动及CLK驱动

在这里插入图片描述
在这里插入图片描述

2.4 设备树配置

前提:所有节点的寄存器属性都依赖于pl.dtsi中生成的节点及属性
打开system-top.dts

&amba_pl {
	hdmi_encoder_0:hdmi_encoder {
		status = "okay";
		compatible = "digilent,drm-encoder";
		// digilent,edid-i2c = <&i2c1>;
		digilent,hpref = <1920>;
        digilent,vpref = <1080>;
	};
	xilinx_drm {
		status = "okay";
		compatible = "xlnx,drm";
		xlnx,vtc = <&v_tc_0>;
		xlnx,connector-type = "HDMIA";
		xlnx,encoder-slave = <&hdmi_encoder_0>;
		clocks = <&axi_dynclk_0>;
		dglnt,edid-i2c = <&i2c1>;
		planes {
			xlnx,pixel-format = "rgb888";
			plane0 {
				dmas = <&axi_vdma_0 0>;
				dma-names = "dma";
			};
		};
	};
};

&axi_dynclk_0 {
	status = "okay";
	compatible = "digilent,axi-dynclk";
	#clock-cells = <0>;
	clocks = <&clkc 15>;
};

&v_tc_0 {
	status = "okay";
	compatible = "xlnx,v-tc-5.01.a";
};

不要问1:为什么我的v_tc_0 compatible 属性是5.01.a,因为下面截图是事实真相。
compatible 属性在设备树中的作用是确保内核能够根据硬件的描述正确地识别和驱动硬件设备,它是设备树与设备驱动程序之间的桥梁
在这里插入图片描述
不要问2:HDMI的iic注释掉是因为当前的板子分辨率自适应失败了,导致drm驱动后面没起来,无赖之举直接将分辨率写成固定值。

三、petalinux下HDMI测试

1、LINUX控制台在显示屏上的展示

在这里插入图片描述

2、LINUIX应用层编码展示自定义图片

总结

这里对文章进行总结:
本次要讲述的zynq的hdmi驱动加载小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

version1.0:初稿,下个版本会补充linux应用显示自定义图片
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值