ZYNQ7000 #1 - PL端模擬HDMI信號輸出環境下的Linux界面顯示

目錄

0 - 前言

1 - petalinux工程的建立與配置

2 - 將解碼驅動配置到linux內核中

3 - petalinux配置linux內核

4 - 修改設備樹

5 - 編譯打包

6 - 文件修改

X - 附錄 問題


0 - 前言

在前面的文章裏(https://blog.csdn.net/sements/article/details/88921275),我們已經使用 petalinux 成功的配置了一個可以在板子上運行的linux系統環境。這篇文章中我們加上HDMI向外輸出圖像信號的功能。

我的開發板是黑金的AX7010,其附帶的資料對於這方面講解的不是很清楚,我也是通過翻找其教程中提到的 “使用Debian系統”附帶的Debian根文件系統解決的在使用 startx 喚起 X 桌面環境後黑屏的問題。究其主要原因還是 需要對 X 桌面環境進行設置,要求其使用FrameBuffer進行繪製

AX7010這個開發板上雖然有HDMI-A的母頭,但是其並沒有板載HDMI芯片,而其對外輸出HDMI信號的方式是利用PL端的IO對HDMI信號的時鐘和數據進行模擬達到的。這裏不過多的介紹關於其如何搭建PL端的方法,而重點關注如何在這樣的環境中配置 X 桌面環境利用FrameBuffer進行圖像繪製。

這裏我們需要準備的是:

  • 開發宿主機:ubuntu 16.04.4 LTS
  • Petalinux:petalinux 2018.3
  • Petalinux配套的Linux源碼:linux-xlnx-xlnx_rebase_v4.14_2018.3
  • Vivado工程生成的 .sdk 文件:linux_base.sdk                     (這個工程是黑金的例程)
  • Digilent提供的視頻解碼驅動(encoder)和時鐘驅動(clk):  (從黑金提供的2017版源碼裏找到的,可以從digilent的github上找到https://github.com/Digilent/linux-digilent
    • linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/clk/clk-dglnt-dynclk.c
    • linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/gpu/drm/xilinx/digilent_encoder.c

1 - petalinux工程的建立與配置

petalinux工程的建立、從 .sdk 導入硬件工程配置、配置rootfs放置在SD卡 以及 配置使用外部linux源碼的方法可以看這篇文章(https://blog.csdn.net/sements/article/details/88921275

 

2 - 將解碼驅動配置到linux內核中

首先按照上述準備工作中的路徑將 clk-fixed-factor.c 時鐘驅動文件, digilent_encoder.c 視頻解碼驅動文件放置到Linux源碼路徑下。

  • 配置 clk-fixed-factor

打開 linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/gpu/drm/xilinx/Kconfig 將 clk-dglnt-dynclk.c 的配置項放入menuconfig中

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.

打開 linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/clk/Makefile 使得 clk-dglnt-dynclk.c 在menuconfig配置好後在linux編譯時能編譯。

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

  • 配置 digilent_encoder

打開 linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/gpu/drm/xilinx/Kconfig,將 digilent_encoder.c 的配置項放入menuconfig中

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.

打開 linux-xlnx-xlnx_rebase_v4.14_2018.3/drivers/gpu/drm/xilinx/Makefile,使得 digilent_encoder.c 在menuconfig配置好後在linux編譯時能編譯。

obj-$(CONFIG_DRM_DIGILENT_ENCODER) += digilent_encoder.o

 

3 - petalinux配置linux內核

運行命令,配置內核

petalinux-config -c kernel

在 Device Drivers -> Graphics support,選擇 Digilent VGA/HDMI DRM Encoder Driver 項按 y。

在 Device Drivers → Common Clock Framework 選項中選擇 Digilent axi_dynclk Driver 按 y

保存退出

注意:這裏不要修改默認的保存文件名 ( .config )

 

4 - 修改設備樹

這裏我是直接用的黑金寫的設備樹。

打開petalinux工程文件夾中 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi,剛生成petalinux的工程文件夾中,這個dtsi文件是空的,將其修改爲以下內容。

/include/ "system-conf.dtsi"

/ {
	model = "Zynq ALINX Development Board";
	compatible = "alinx,zynq", "xlnx,zynq-7000";
	aliases {
		ethernet0 = "&gem0";
		serial0 = "&uart1";
	};

	usb_phy0: usb_phy@0 {
		compatible = "ulpi-phy";
		#phy-cells = <0>;
		reg = <0xe0002000 0x1000>;
		view-port = <0x0170>;
		drv-vbus;
	};


};

&i2c0 {
	clock-frequency = <100000>;
};

&usb0 {
	dr_mode = "host";	
	usb-phy = <&usb_phy0>;
};

&sdhci0 {
	u-boot,dm-pre-reloc;
};

&uart1 {
	u-boot,dm-pre-reloc;
};


&flash0 {
	compatible = "micron,m25p80", "w25q256", "spi-flash";
};


&gem0 {
	phy-handle = <&ethernet_phy>;
	ethernet_phy: ethernet-phy@1 {
		reg = <1>;
		device_type = "ethernet-phy";
	};
};



&amba_pl {

	hdmi_encoder_0:hdmi_encoder {
		compatible = "digilent,drm-encoder";
		digilent,edid-i2c = <&i2c0>;
	};

	xilinx_drm {
		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 = <&i2c0>;
		planes {
			xlnx,pixel-format = "rgb888";
			plane0 {
				dmas = <&axi_vdma_0 0>;
				dma-names = "dma";
			};
		};
	};
};
&axi_dynclk_0 {
	compatible = "digilent,axi-dynclk";
	#clock-cells = <0>;
	clocks = <&clkc 15>;
};
&v_tc_0 {
	compatible = "xlnx,v-tc-5.01.a";
};

這裏面最重要的部分是 amba_pl 下的 hdmi_encoder 和 xilinx_drm部分的設置

 

5 - 編譯打包

用下面命令編譯uboot、內核、根文件系統、設備樹等

petalinux-build

用下面命令打包生成 BOOT.BIN 文件

petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force

將生成的 BOOT.BIN 及 image.ub 拷貝到 SD 卡的FAT分區,根文件系統已放置到EXT分區

 

6 - 文件修改

  • /etc/X11/xorg.conf.d 下的 99-fbdev.conf

這裏我是之前建立ubuntu文件系統的時候就已經在該文件夾下加入了一個 40-libinput.conf(建立ubuntu文件系統參考這裏https://blog.csdn.net/sements/article/details/88086468

這裏只是爲了讓 X 界面系統啓動的時候設定利用framebuffer進行繪製,所以有兩種可選的方法。第一種在該目錄(/etc/X11/xorg.conf.d)下已有的 40-libinput.conf 配置文件中加入語句。第二種就是新建一個 .conf 文件,這裏叫它 99-fbdev.conf (前面的數字影響着 X 界面系統啓動加載這些配置文件時的順序),然後在這個文件中加入語句。

Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb0"
EndSection
  • /etc/X11/xinit/xinitrc 文件

/etc/X11/xinit/xinitrc 文件是在調用語句 startx 後回加載的腳本,這裏我面進行了一些操作:

1.載入變量 "export DISPLAY=:0.0",

2.關閉了 X 桌面系統的電源管理和屏幕保護

3.加載了我自己寫的一個有界面的小程序

4. 喚起openbox-session

#!/bin/sh

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
#. /etc/X11/Xsession

export DISPLAY=:0.0
echo "TURN OFF DPMS"
xset s off
xset dpms 0 0 0
xset -dpms

/home/sements/developArea/RailTranser-Studio/RailTranser-Studio/RailTranser-Studio &
#xeyes&

openbox-session 
  • /etc/rc.local

這個文件是一種比較老舊的 Linux 開機啓動自定義命令的方法,這個文件裏面我做了一些操作

1.喚起 eth0 ,並使用 dhclient 自動獲取 ip 地址

2.使用 startx 命令喚起 X 桌面系統(其運行後就會加載 /etc/X11/xinit/xinitrc 文件腳本和 /etc/X11/xorg.conf.d 下的本機配置項)

#!/bin/bash

ifconfig eth0 up &
dhclient &

startx &

exit 0

爲了使 rc.local 開機運行腳本,不要忘了給它加上可執行權限

 

X - 附錄 問題

在沒有正確的配置 X 使用 Framebuffer進行繪製時,使用 startx 開啓圖形界面時可能出現以下錯誤

  • Failed to launch bus: Failed to connect to session bus
  • 喚醒了 X 但是黑屏
  • AddScreen/ScreenInit failed for driver 0
  • 等等

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章