基于zynq在linux下的HDMI实战
ZYNQ系列文章目录
第一章:基于zynq在linux下的phy调试记录
第二章:qemu制作ubuntu文件系统
第三章:基于zynq在linux下的AXI-CAN实战
第四章:基于zynq在linux下的HDMI实战
文章目录
- ZYNQ系列文章目录
- 前言
- 一、vivado中HDMI的配置
- 1.1 IP核准备
- 1.2 vivado Diagram配置
- 1.3 SDK配置
- 二、petalinux中HDMI的配置
- 2.1 内核驱动准备
- 2.2 内核驱动添加
- 2.3 内核配置
- 2.4 设备树配置
- 三、petalinux下HDMI测试
- 1、LINUX控制台在显示屏上的展示
- 2、LINUIX应用层编码展示自定义图片
- 总结
前言
记录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应用显示自定义图片