OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6229|回复: 2

[XILINX] 【正点原子FPGA连载】第八章 Linux显示设备的使用--摘自【正点原子】领航者ZYNQ之Linux开发指南_V1.3

[复制链接]

1107

主题

1118

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4615
金钱
4615
注册时间
2019-5-8
在线时间
1218 小时
发表于 2020-11-27 10:35:06 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2020-11-27 10:31 编辑

1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:712557122
5)关注正点原子公众号,获取最新资料更新
1.jpg
1120.png
第八章Linux显示设备的使用

领航者开发板上有两个显示设备接口,分别为HDMI接口和LCD接口,这两个接口可以用来接HDMI显示器和正点原子的LCD液晶屏,使用图形界面的时候可以通过这两个接口分别显示在HDMI显示器和LCD液晶屏上。本章我们讲解如何使用Petalinux配置Linux内核和设备树来驱动HDMI显示器和LCD液晶屏。


1.1 准备工作
HDMI的显示首先需要硬件层面的支持,在《领航者ZYNQ之嵌入式开发指南》的《SD卡读BMP图片HDMI显示实验》中我们实现了裸机驱动HDMI的显示,可见硬件层面是没有问题的。如果想实现Linux驱动HDMI的显示,除了需要该实验对应的Vivado工程的硬件平台支持外,还需要相应的Linux驱动程序,同样LCD的显示除了硬件层面的支持外也需要一个驱动。
Linux显示设备的驱动程序我们放在了提供的内核源码中。在我们提供的光盘资料:ZYNQ开发板资料盘(A盘)\4_SourceCode\ZYNQ_7020\3_Embedded_Linux\资源文件\kernel目录下有两个源码包,分别是linux-xlnx-xilinx-v2018.3.tar.gz和linux-4.14.0-atk-v2018.3.tar.gz,前者是Xilinx官方提供的Linux内核源码包,后者是我们定制的用于领航者开发板的Linux内核源码包,里面添加了适用于领航者开发板的驱动程序,该内核源码已托管到gitee网站:https://gitee.com/greatdream/linux,可从该网站获取最新的领航者开发板的linux内核源码。
我们将linux-4.14.0-atk-v2018.3.tar.gz解压到ubuntu系统的work/petalinux/目录下,或者从gitee网站clone到work/petalinux/目录下,推荐使用第二种方式,在终端输入命令如下:
cd~/work/petalinux/
上面的命令实现的功能就是将托管到gitee上的Linux内核源码clone到linux-4.14目录下,clone完成后,进入到linux-4.14目录下,可看到linux内核源码已下载完成,如下图所示:
image001.png

20.1.1 linux内核源码目录
至此我们的准备工作就完成了,下面我们配置Petalinux工程和Linux内核以及设备树来驱动HDMI或LCD的显示。
1.2 配置Petalinux工程
进入到第六章创建的Petalinux工程目录下,输入如下命令,设置Petalinux运行所需的环境变量,
sptl
或者
source /opt/pkg/petalinux/2018.3/settings.sh
执行结果如下图所示:
image003.jpg

20.2.1 设置Petalinux运行所需的环境变量
现在重新配置petalinux,重新设置Linux内核的来源,输入如下命令:
petalinux-config
在弹出的配置窗口中,进入到“LinuxComponents Selection--->linux-kernel(linux-xlnx)”菜单下,配置Linux内核来源。此处选择“ext-local-src”,也就是本地存放的Linux内核源码,如下图所示:
image005.jpg

20.2.2 选择“ext-local-src”
也可以选择“remote”选项,将远程路径指向我们托管的gitee网站,此处以本地路径为例进行讲解。按键盘上的下方向键移到“ext-local-src”,然后按键盘上的“Enter“键确定,返回到上一界面,如下图所示:
image007.jpg

20.2.3 返回到上一界面
进入“Externallinux-kernel local source settings”子菜单,如下图所示:
image009.jpg

20.2.4 Externallinux-kernel local source settings”子菜单
按键盘上的“Enter”键配置“EXternal linux-kernel local source path”,如下图所示:
image011.jpg

20.2.5 填写Linux内核源码的本地路径
也就是填写Linux内核源码的本地路径,上一节我们将Linux内核源码clone到/home/zynq/work/petalinux/linux-4.14目录,所以此处填写该目录。填写完成后,按键盘上的“Enter”键完成配置,返回到上一界面,如下图所示:
image013.jpg

20.2.6 填写内核路径完成后的界面
现在保存配置并退出,下一步,配置Linux内核。
1.3 配置Linux内核
Linux内核默认都是配置好的,无需配置。下面我们看下进行了那些配置。在终端中输入如下命令:
petalinux-config-c kernel
弹出Linux内核的配置窗口。在内核配置窗口中,进入“Device Drivers”菜单下的“Graphics support”菜单下,
image015.jpg

20.3.1 Graphicssupport”菜单
可以看到默认配置了“XilinxLCD framebuffer driver support By Alientek”,该驱动可以用来驱动HDMI和LCD的显示。
在“Device Drivers”菜单下的“Common Clock Framework”菜单下,可以看到默认配置了“Digilentaxi_dynclk Driver”,该驱动可以根据不同的分辨率输出不同的像素时钟。
至此,内核方面的配置也就完成了。保存并退出,进入下一步,配置设备树。
1.4 配置设备树
编辑当前工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。由于文件内容太长,此处就不全部粘贴了,主要讲解下在第6.2.7节的配置的基础上追加哪些内容,在beep后面追加视频时序,内容如下:
  1.      beep {
  2.          compatible = "gpio-beeper";
  3.          gpios = <&gpio0 57 GPIO_ACTIVE_HIGH>;
  4.      };

  5.      video_timings {
  6.              timing_4x3_480x272: timing0 {
  7.                  clock-frequency = <9000000>;
  8.                  hactive = <480>;
  9.                  vactive = <272>;

  10.                  hback-porch = <40>;
  11.                  hsync-len = <20>;
  12.                  hfront-porch = <5>;
  13.                  vback-porch = <8>;
  14.                  vsync-len = <3>;
  15.                  vfront-porch = <8>;

  16.                  hsync-active = <0>;
  17.                  vsync-active = <0>;
  18.                  de-active = <1>;
  19.                  pixelclk-active = <0>;
  20.              };

  21.              timing_4x3_800x480: timing1 {
  22.                      clock-frequency = <33000000>;
  23.                      hactive = <800>;
  24.                      vactive = <480>;

  25.                      hback-porch = <88>;
  26.                      hsync-len = <48>;
  27.                      hfront-porch = <40>;
  28.                      vback-porch = <32>;
  29.                      vsync-len = <3>;
  30.                      vfront-porch = <13>;

  31.                      hsync-active = <0>;
  32.                      vsync-active = <0>;
  33.                      de-active = <1>;
  34.                      pixelclk-active = <0>;
  35.              };

  36.              timing_7_800x480: timing2 {
  37.                      clock-frequency = <33000000>;
  38.                      hactive = <800>;
  39.                      vactive = <480>;

  40.                      hback-porch = <46>;
  41.                      hsync-len = <20>;
  42.                      hfront-porch = <210>;
  43.                      vback-porch = <23>;
  44.                      vsync-len = <3>;
  45.                      vfront-porch = <22>;

  46.                      hsync-active = <0>;
  47.                      vsync-active = <0>;
  48.                      de-active = <1>;
  49.                      pixelclk-active = <0>;
  50.              };

  51.              timing_7_1024x600: timing3 {
  52.                      clock-frequency = <51000000>;
  53.                      hactive = <1024>;
  54.                      vactive = <600>;

  55.                      hback-porch = <140>;
  56.                      hsync-len = <20>;
  57.                      hfront-porch = <160>;
  58.                      vback-porch = <20>;
  59.                      vsync-len = <3>;
  60.                      vfront-porch = <12>;

  61.                      hsync-active = <0>;
  62.                      vsync-active = <0>;
  63.                      de-active = <1>;
  64.                      pixelclk-active = <0>;
  65.              };

  66.              timing_10x1_1280x800: timing4 {
  67.                      clock-frequency = <71100000>;
  68.                      hactive = <1280>;
  69.                      vactive = <800>;

  70.                      hback-porch = <80>;
  71.                      hsync-len = <10>;
  72.                      hfront-porch = <70>;
  73.                      vback-porch = <10>;
  74.                      vsync-len = <3>;
  75.                      vfront-porch = <10>;

  76.                      hsync-active = <0>;
  77.                      vsync-active = <0>;
  78.                      de-active = <1>;
  79.                      pixelclk-active = <1>;
  80.              };

  81.              timing_1920x1080: timing5 {
  82.                      clock-frequency = <148500000>;
  83.                      hactive = <1920>;
  84.                      vactive = <1080>;

  85.                      hback-porch = <148>;
  86.                      hsync-len = <44>;
  87.                      hfront-porch = <88>;
  88.                      vback-porch = <36>;
  89.                      vsync-len = <5>;
  90.                      vfront-porch = <4>;

  91.                      hsync-active = <0>;
  92.                      vsync-active = <0>;
  93.                      de-active = <1>;
  94.                      pixelclk-active = <1>;
  95.              };
  96.      };
复制代码
video_timings开始就是追加的内容,以timing_4x3_480x272为例,讲解下命名的格式,timing也就是时序,4x3对应的是4.3寸LCD液晶屏,480x272对应的是该液晶屏的分辨率为480x272,{}内的就是具体的驱动时序,需要说明的是timing_1920x1080对应的是HDMI分辨率为1920x1080的时序。
除了追加以上内容外,还需要在该文件的尾部追加以下内容:
  1. &axi_dynclk_0 {
  2.      compatible = "digilent,axi-dynclk";
  3.      clocks = <&clkc 15>;
  4.      #clock-cells = <0>;
  5. };

  6. &v_tc_0 {
  7.      compatible = "xlnx,v-tc-5.01.a";
  8. };

  9. &amba_pl {
  10.      xlnx_vdma_hdmi {
  11.          compatible = "xilinx,vdmafb";
  12.          status = "okay";

  13.          xlnx,vtc = <&v_tc_0>;
  14.          clocks = <&axi_dynclk_0>;
  15.          clock-names = "hdmi_pclk";
  16.          dmas = <&axi_vdma_0 0>;
  17.          dma-names = "hdmi_vdma";

  18.          is-hdmi = <0x1>;

  19.          display-timings = <&timing_1920x1080>;
  20.          xlnx,pixel-format = "bgr888";
  21.      };
  22. };
复制代码
amba_pl配置的是HDMI的驱动,如果显示设备是LCD液晶屏,则需要将amba_pl修改成如下的内容:
  1. &amba_pl {
  2.    xlnx_vdma_lcd {
  3.        compatible = "xilinx,vdmafb";
  4.         status = "okay";
  5.         xlnx,vtc = <&v_tc_0>;
  6.         clocks = <&axi_dynclk_0>;
  7.         clock-names = "lcd_pclk";
  8.         dmas = <&axi_vdma_0 0>;
  9.         dma-names = "lcd_vdma";
  10.         is-hdmi = <0x0>;
  11.         rst-gpios = <&gpio0 62 GPIO_ACTIVE_LOW>;
  12.         bl-gpios = <&gpio0 61 GPIO_ACTIVE_HIGH>;
  13.         
  14.         atk,lcd-id = <&axi_gpio_0 0 0 GPIO_ACTIVE_LOW
  15.                  &axi_gpio_0 1 0 GPIO_ACTIVE_LOW
  16.                  &axi_gpio_0 2 0 GPIO_ACTIVE_LOW>;
  17.         display-timings = <&timing_4x3_480x272
  18.                   &timing_4x3_800x480
  19.                   &timing_7_800x480
  20.                   &timing_7_1024x600
  21.                   &timing_10x1_1280x800>;
  22.         xlnx,pixel-format = "rgb888";
  23.     };
  24. };
复制代码
设备树配置内容已经放在我们提供的例程源码当中,路径为:“领航者ZYNQ开发板资料盘(A盘)\4_SourceCode\ZYNQ_7020\3_Embedded_Linux\zynq_petalinux\2_linux_hdmi\software\petalinux\project-spec\meta-user\recipes-bsp\device-tree\files\system-user.dtsi”,可以打开这个文件将里面的内容拷贝到这个文件中,默认提供的是HDMI的驱动配置,LCD的驱动配置需要自行替换该文件中amba_pl的内容。
配置完了设备树之后,就是编译Petalinux工程了。
1.5 编译Petalinux工程
现在我们编译整个Petalinux工程,在终端输入如下命令:
petalinux-build
执行结果如下图所示:
image017.jpg

图20.5.1 编译整个Petalinux工程
1.6 制作BOOT.BIN启动文件并复制到SD
使用下面命令生成 BOOT文件:
petalinux-package--boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force
执行结果如下图所示:
image019.jpg

图20.6.1 生成 BOOT文件
生成BOOT文件后,我们插入SD卡,将该工程image/linux目录下的BOOT.BIN和image.ub文件拷贝到名为BOOT的分区也即/dev/sdc1分区中,如下图所示:
image021.jpg

20.6.2 拷贝启动镜像到第一个分区
本实验只需要这两个文件即可,现在可以卸载SD卡了。
1.7 在开发板上启动Linux
将SD卡插入领航者开发板的SD卡槽(卡槽位于开发板背面),然后使用Mini USB连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。接下来将领航者底板上的启动模式开关设置为从SD卡启动。最后连接开发板的电源线,并打开电源开关。
HDMI显示器显示的内容如下图所示:
image023.jpg

20.7.1 HDMI显示器显示结果
此时如果在领航者开发板上插入键盘,就可以登录了,登录的用户名为:root,密码为:root。此处我们就不演示了。
至此我们完成了Linux显示设备的驱动。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-3-11
在线时间
8 小时
发表于 2021-10-6 21:44:51 | 显示全部楼层
更改为LCD的显示程序后,LCD屏幕无法显示,请问是什么原因?
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-3-11
在线时间
8 小时
发表于 2021-10-6 22:04:08 | 显示全部楼层
原子哥,我用的资料中的LCD显示程序,但实际情况是LCD无法显示出界面,不知什么原因?编译的过程中没有任何报错。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 22:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表