搜索
bottom↓
回复: 0

《领航者ZYNQ之嵌入式Linux开发指南_V2.0》第九章 Linux显示设备

[复制链接]

出0入234汤圆

发表于 2021-12-31 18:26:33 | 显示全部楼层 |阅读模式
1)实验平台:正点原子领航者V2 ZYNQ开发板
2)  章节摘自【正点原子】《领航者ZYNQ之嵌入式Linux开发指南_V2.0》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-329957-1-1.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FP
GA技术交流QQ群:90562473 1.png

2.jpg


3.png


第九章 Linux显示设备的使用

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

       1.1准备工作

       LCD或者HDMI的显示首先需要硬件层面的支持,也就是需要搭建对应的vivado工程,在第六章当中我们统一使用了正点原子为领航者开发板所配置vivado工程,同样该工程也是开发板出厂时烧录的系统中所使用的工程,对于领航者7020来说,正点原子提供的vivado工程支持LCD和HDMI,但是对于领航者7010来说,其提供的工程不支持HDMI,原因在于7010 PL端逻辑资源较少,为了其它外设能够配置上,故而取消了HDMI。
       除了需要该实验对应的Vivado工程的硬件平台支持外,还需要相应的Linux驱动程序,LCD和HDMI显示设备的驱动程序我们放在了提供的内核源码中。在我们提供的光盘资料:ZYNQ开发板资料盘(A盘)\4_SourceCode\3_Embedded_Linux\资源文件\kernel目录下有两个内核源码包,分别是linux-xlnx-xilinx-v2018.3.tar.gz和alientek-linux-4.14.0-xlnx-v2018.3.tar.gz,前者是Xilinx官方提供的Linux内核源码包,后者是正点原子针对于领航者开发板进行移植、修改的Linux内核源码包,里面添加了适用于领航者开发板的驱动程序。
       我们将alientek-linux-4.14.0-xlnx-v2018.3.tar.gz拷贝到ubuntu系统中,如下所示:
第九章 Linux显示设备的使用764.png

图 9.1.1 将Linux源码拷贝到Ubuntu系统

       接下来将其解压,对应的解压目录就是内核源码目录,这个解压目录大家可以自己设置,笔者这里选择将其解压到用户家目录下的work/linux-4.14目录中:
  1. mkdir -p ~/work/linux-4.14                                                //创建目录
  2. tar -xzf alientek-linux-4.14.0-xlnx-v2018.3.tar.gz -C ~/work/linux-4.14/                //解压
  3. sync                        //同步
  4. rm -rf alientek-linux-4.14.0-xlnx-v2018.3.tar.gz                //删除压缩包文件
复制代码
第九章 Linux显示设备的使用1104.png

图 9.1.2 解压Linux内核源码

       解压完成后,进入到work/linux-4.14目录下,可看到linux内核源码目录结构,如下图所示:
第九章 Linux显示设备的使用1221.png

图 9.1.3 linux内核源码目录

       接下来再将U-Boot源码拷贝到Ubuntu系统中,同样这里也是使用正点原子针对于领航者开发板进行移植、修改过的U-Boot源码包,而不再使用petalinux默认的U-Boot源码,在开发板资料包:ZYNQ开发板资料盘(A盘)\4_SourceCode\3_Embedded_Linux\资源文件\uboot目录下也有两个U-Boot源码压缩包文件,分别是u-boot-xlnx-xilinx-v2018.3.tar.gz和alientek-uboot-2018.01-xlnx-v2018.3.tar.gz,同理u-boot-xlnx-xilinx-v2018.3.tar.gz是Xilinx官方提供的原版U-Boot源码包,而alientek-uboot-2018.01-xlnx-v2018.3.tar.gz便是正点原子针对于领航者开发板进修改过的U-Boot源码包,这里我们将alientek-uboot-2018.01-xlnx-v2018.3.tar.gz压缩包文件拷贝到Ubuntu系统中,如下所示:
第九章 Linux显示设备的使用1745.png

图 9.1.4 将U-Boot源码拷贝到Ubuntu系统

       接下来将其解压,对应的解压目录就是U-Boot源码目录,这个解压目录大家可以自己设置,笔者这里选择将其解压到用户家目录下的work/uboot-2018.01目录中:
  1. mkdir ~/work/uboot-2018.01
  2. tar -xzf alientek-uboot-2018.01-xlnx-v2018.3.tar.gz -C ~/work/uboot-2018.01/
  3. sync
  4. rm -rf alientek-uboot-2018.01-xlnx-v2018.3.tar.gz
复制代码
第九章 Linux显示设备的使用2062.png

图 9.1.5 解压U-Boot源码包

        解压完成后,进入到work/uboot-2018.01目录下,可看到U-Boot源码目录结构,如下图所示:
第九章 Linux显示设备的使用2181.png

图 9.1.6 U-Boot源码目录结构

       至此我们准备工作就已经完成了,接下来需要对petalinux工程进行配置。
      1.2配置Petalinux工程
       进入到第六章创建的Petalinux工程目录下,输入如下命令,设置Petalinux运行所需的环境变量
  1. source /opt/pkg/petalinux/2018.3/settings.sh
复制代码
       大家根据自己的安装路径修改settings.sh脚本文件的路径信息,如果当前终端已经source了该脚本文件,则无需再次source。
       现在重新配置petalinux,重新设置Linux内核的来源,输入如下命令:
  1. petalinux-config
复制代码
       在弹出的配置窗口中,进入到“Linux Components Selection--->linux-kernel(linux-xlnx)”菜单下,配置Linux内核来源。此处选择“ext-local-src”,也就是本地存放的Linux内核源码,如下图所示:
第九章 Linux显示设备的使用2650.png

图 9.2.1 选择“ext-local-src”

       按键盘上的下方向键移到“ext-local-src”,然后按键盘上的“Enter“键确定,返回到上一界面,如下图所示:
第九章 Linux显示设备的使用2781.png

图 9.2.2 返回到上一界面

       进入“External linux-kernel local source settings”子菜单,如下图所示:
第九章 Linux显示设备的使用2900.png

图 9.2.3 “External linux-kernel local source settings”子菜单

       按键盘上的“Enter”键配置“EXternal linux-kernel local source path”,如下图所示:
第九章 Linux显示设备的使用3066.png

图 9.2.4 填写Linux内核源码的本地路径

       也就是填写Linux内核源码的本地路径,上一节我们将Linux内核源码解压到了Ubuntu系统/home/zynq/work/linux-4.14目录,所以此处填写该目录,大家根据自己的路径填写即可,填写完成后,按键盘上的“Enter”键完成配置,返回到上一界面,如下图所示:
第九章 Linux显示设备的使用3275.png

图 9.2.5 本地内核源码配置完成

        Linux内核源码来源配置完成之后,接着配置U-Boot源码来源,连按两次ESC键回到上一级菜单,选择“u-boot (u-boot-xlnx)  --->”配置项,按回车设置U-Boot源码来源,同样这里我们也是选择“ext-local-src”,也就是本地存放的U-Boot源码,如下所示:
第九章 Linux显示设备的使用3487.png

图 9.2.6 选择“ext-local-src”

       按键盘上的下方向键移到“ext-local-src”,然后按键盘上的“Enter“键确定,返回到上一界面,如下图所示:
第九章 Linux显示设备的使用3618.png

图 9.2.7 返回上一级菜单

       进入“External u-boot local source settings”子菜单,如下图所示:
第九章 Linux显示设备的使用3731.png

图 9.2.8 “External u-boot local source settings”子菜单

        按键盘上的“Enter”键配置“EXternal u-boot local source path”,如下图所示:
第九章 Linux显示设备的使用3885.png

图 9.2.9 配置本地U-Boot源码路径

       这里填写本地U-Boot源码路径,上一节我们将U-Boot源码解压到了Ubuntu系统/home/zynq/work/uboot-2018.01目录,所以此处填写该目录,大家根据自己的路径填写即可,填写完成后,按键盘上的“Enter”键完成配置,返回到上一界面,如下图所示:
第九章 Linux显示设备的使用4091.png

图 9.2.10 配置完成

       至此我们就配置完成了,接下来保存petalinux工程配置信息,退出配置界面即可。
       1.3配置Linux内核
       正点原子提供的Linux内核默认都是配置好的,无需配置。这里给大家找一下该内核源码中对应的LCD或HDMI驱动模块配置项,在终端中输入如下命令:
  1. petalinux-config -c kernel
复制代码
       弹出Linux内核的配置窗口。在内核配置窗口中,进入“Device Drivers”菜单下的“Graphics support”菜单下,
第九章 Linux显示设备的使用4371.png

图 9.3.1 “Graphics support”菜单

       可以看到默认配置了“Xilinx LCD framebuffer driver support By Alientek”,该驱动可以用来驱动HDMI和LCD的显示。
       在“Device Drivers”菜单下的“Common Clock Framework”菜单下,可以看到默认配置了“Digilent axi_dynclk Driver”,该驱动可以根据不同的分辨率输出不同的像素时钟。
       至此,内核方面的配置也就完成了。保存并退出,进入下一步,配置设备树。
       1.4配置设备树
       编辑当前工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。由于修改后system-user.dtsi文件内容太长,此处就不全部粘贴了,下面给大家粘贴出在第6.2.7小节配置的基础上追加的内容。
       对于领航者7010来说,正点原子配置的vivado工程并不支持HDMI,原因前面已经给大家解释过了,所以不需要添加HDMI相关的配置信息,所以领航者7010来说,对应需要添加的配置信息如下:
  1. &PWM_0 {
  2.     compatible = "digilent,axi-pwm";
  3.     #pwm-cells = <2>;
  4.     clock-names = "pwm";
  5.     npwm = <1>;
  6. };

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

  10. &lcd_vdma {
  11.     dma-ranges = <0x00000000 0x00000000 0x20000000>;    // 512MB
  12. };

  13. &amba_pl {
  14.     xlnx_vdmafb_lcd {
  15.         compatible = "xilinx,vdmafb";
  16.         status = "okay";

  17.         vtc = <&lcd_vtc>;
  18.         clocks = <&clk_wiz_0 0>;
  19.         clock-names = "lcd_pclk";
  20.         dmas = <&lcd_vdma 0>;
  21.         dma-names = "lcd_vdma";

  22.         pwms = <&PWM_0 0 5000000>;
  23.         reset-gpio = <&gpio0 61 GPIO_ACTIVE_LOW>;
  24.         lcdID-gpio = <&gpio1 0 0 GPIO_ACTIVE_LOW &gpio1 1 0 GPIO_ACTIVE_LOW &gpio1 2 0 GPIO_ACTIVE_LOW>;

  25.         display-timings {
  26.             timing_4342: timing0 {
  27.                 clock-frequency = <9000000>;
  28.                 hactive = <480>;
  29.                 vactive = <272>;
  30.                 hback-porch = <40>;
  31.                 hfront-porch = <5>;
  32.                 hsync-len = <1>;
  33.                 vback-porch = <8>;
  34.                 vfront-porch = <8>;
  35.                 vsync-len = <1>;
  36.                 hsync-active = <0>;
  37.                 vsync-active = <0>;
  38.                 de-active = <1>;
  39.                 pixelclk-active = <0>;
  40.             };
  41.             timing_4384: timing1 {
  42.                 clock-frequency = <31000000>;
  43.                 hactive = <800>;
  44.                 vactive = <480>;
  45.                 hback-porch = <88>;
  46.                 hfront-porch = <40>;
  47.                 hsync-len = <48>;
  48.                 vback-porch = <32>;
  49.                 vfront-porch = <13>;
  50.                 vsync-len = <3>;
  51.                 hsync-active = <0>;
  52.                 vsync-active = <0>;
  53.                 de-active = <1>;
  54.                 pixelclk-active = <0>;
  55.             };
  56.             timing_7084: timing2 {
  57.                 clock-frequency = <33300000>;
  58.                 hactive = <800>;
  59.                 vactive = <480>;
  60.                 hback-porch = <46>;
  61.                 hfront-porch = <210>;
  62.                 hsync-len = <1>;
  63.                 vback-porch = <23>;
  64.                 vfront-porch = <22>;
  65.                 vsync-len = <1>;
  66.                 hsync-active = <0>;
  67.                 vsync-active = <0>;
  68.                 de-active = <1>;
  69.                 pixelclk-active = <0>;
  70.             };
  71.             timing_7016: timing3 {
  72.                 clock-frequency = <51200000>;
  73.                 hactive = <1024>;
  74.                 vactive = <600>;
  75.                 hback-porch = <140>;
  76.                 hfront-porch = <160>;
  77.                 hsync-len = <20>;
  78.                 vback-porch = <20>;
  79.                 vfront-porch = <12>;
  80.                 vsync-len = <3>;
  81.                 hsync-active = <0>;
  82.                 vsync-active = <0>;
  83.                 de-active = <1>;
  84.                 pixelclk-active = <0>;
  85.             };
  86.             timing_1018: timing4 {
  87.                 clock-frequency = <71100000>;
  88.                 hactive = <1280>;
  89.                 vactive = <800>;
  90.                 hback-porch = <80>;
  91.                 hfront-porch = <70>;
  92.                 hsync-len = <10>;
  93.                 vback-porch = <10>;
  94.                 vfront-porch = <10>;
  95.                 vsync-len = <3>;
  96.                 hsync-active = <0>;
  97.                 vsync-active = <0>;
  98.                 de-active = <1>;
  99.                 pixelclk-active = <0>;
  100.             };
  101.         };
  102.     };
  103. };
复制代码
       如果大家用的开发板是领航者7010,则直接将上面内容copy出来粘贴到system-user.dtsi设备树文件原有内容的最后面即可,也就是在原有内容的基础上追加以上内容。
       对于领航者7020来说,对应需要添加的配置信息如下:
  1. &pwm_0 {
  2.     compatible = "digilent,axi-pwm";
  3.     #pwm-cells = <2>;
  4.     clock-names = "pwm";
  5.     npwm = <1>;
  6. };

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

  10. &lcd_vdma {
  11.     dma-ranges = <0x00000000 0x00000000 0x40000000>;    // 1GB
  12. };

  13. &hdmi_vtc {
  14.     clocks = <&hdmi_dynclk>, <&clkc 15>;
  15.     compatible = "xlnx,v-tc-5.01.a";
  16. };

  17. &hdmi_dynclk {
  18.     compatible = "digilent,axi-dynclk";
  19.     #clock-cells = <0>;
  20. };

  21. &hdmi_vdma {
  22.     dma-ranges = <0x00000000 0x00000000 0x40000000>;    // 1GB
  23. };

  24. &amba_pl {
  25.     xlnx_vdmafb_lcd {
  26.         compatible = "xilinx,vdmafb";
  27.         status = "okay";

  28.         vtc = <&lcd_vtc>;
  29.         clocks = <&clk_wiz_0 0>;
  30.         clock-names = "lcd_pclk";
  31.         dmas = <&lcd_vdma 0>;
  32.         dma-names = "lcd_vdma";

  33.         pwms = <&pwm_0 0 5000000>;
  34.         reset-gpio = <&gpio0 61 GPIO_ACTIVE_LOW>;
  35.         lcdID-gpio = <&gpio1 0 0 GPIO_ACTIVE_LOW &gpio1 1 0 GPIO_ACTIVE_LOW &gpio1 2 0 GPIO_ACTIVE_LOW>;

  36.         display-timings {
  37.             timing_4342: timing0 {
  38.                 clock-frequency = <9000000>;
  39.                 hactive = <480>;
  40.                 vactive = <272>;
  41.                 hback-porch = <40>;
  42.                 hfront-porch = <5>;
  43.                 hsync-len = <1>;
  44.                 vback-porch = <8>;
  45.                 vfront-porch = <8>;
  46.                 vsync-len = <1>;
  47.                 hsync-active = <0>;
  48.                 vsync-active = <0>;
  49.                 de-active = <1>;
  50.                 pixelclk-active = <0>;
  51.             };
  52.             timing_4384: timing1 {
  53.                 clock-frequency = <31000000>;
  54.                 hactive = <800>;
  55.                 vactive = <480>;
  56.                 hback-porch = <88>;
  57.                 hfront-porch = <40>;
  58.                 hsync-len = <48>;
  59.                 vback-porch = <32>;
  60.                 vfront-porch = <13>;
  61.                 vsync-len = <3>;
  62.                 hsync-active = <0>;
  63.                 vsync-active = <0>;
  64.                 de-active = <1>;
  65.                 pixelclk-active = <0>;
  66.             };
  67.             timing_7084: timing2 {
  68.                 clock-frequency = <33300000>;
  69.                 hactive = <800>;
  70.                 vactive = <480>;
  71.                 hback-porch = <46>;
  72.                 hfront-porch = <210>;
  73.                 hsync-len = <1>;
  74.                 vback-porch = <23>;
  75.                 vfront-porch = <22>;
  76.                 vsync-len = <1>;
  77.                 hsync-active = <0>;
  78.                 vsync-active = <0>;
  79.                 de-active = <1>;
  80.                 pixelclk-active = <0>;
  81.             };
  82.             timing_7016: timing3 {
  83.                 clock-frequency = <51200000>;
  84.                 hactive = <1024>;
  85.                 vactive = <600>;
  86.                 hback-porch = <140>;
  87.                 hfront-porch = <160>;
  88.                 hsync-len = <20>;
  89.                 vback-porch = <20>;
  90.                 vfront-porch = <12>;
  91.                 vsync-len = <3>;
  92.                 hsync-active = <0>;
  93.                 vsync-active = <0>;
  94.                 de-active = <1>;
  95.                 pixelclk-active = <0>;
  96.             };
  97.             timing_1018: timing4 {
  98.                 clock-frequency = <71100000>;
  99.                 hactive = <1280>;
  100.                 vactive = <800>;
  101.                 hback-porch = <80>;
  102.                 hfront-porch = <70>;
  103.                 hsync-len = <10>;
  104.                 vback-porch = <10>;
  105.                 vfront-porch = <10>;
  106.                 vsync-len = <3>;
  107.                 hsync-active = <0>;
  108.                 vsync-active = <0>;
  109.                 de-active = <1>;
  110.                 pixelclk-active = <0>;
  111.             };
  112.         };
  113.     };

  114.     xlnx_vdmafb_hdmi {
  115.         compatible = "xilinx,vdmafb";
  116.         status = "okay";

  117.         vtc = <&hdmi_vtc>;
  118.         clocks = <&hdmi_dynclk>;
  119.         clock-names = "lcd_pclk";
  120.         dmas = <&hdmi_vdma 0>;
  121.         dma-names = "lcd_vdma";

  122.         hdmi;

  123.         display-timings {
  124.             timing_1080p: timing5 {
  125.                 clock-frequency = <148500000>;
  126.                 hactive = <1920>;
  127.                 vactive = <1080>;
  128.                 hback-porch = <148>;
  129.                 hsync-len = <44>;
  130.                 hfront-porch = <88>;
  131.                 vback-porch = <36>;
  132.                 vsync-len = <5>;
  133.                 vfront-porch = <4>;
  134.                 hsync-active = <0>;
  135.                 vsync-active = <0>;
  136.                 de-active = <0>;
  137.                 pixelclk-active = <1>;
  138.             };
  139.         };
  140.     };
  141. };
复制代码
       如果大家用的开发板是领航者7020,则直接将上面内容copy出来粘贴到system-user.dtsi设备树文件原有内容的最后面即可,也就是在原有内容的基础上追加以上内容。
领航者7010开发板和领航者7020开发板所需要添加的设备树配置信息不一样,其主要在于领航者7010没有支持HDMI,所以设备树当中自然也就没有添加对应的配置信息。在上面添加的内容当中可以看到有很多timing节点,这些其实就是对应的LCD屏或HDMI的时序参数信息,譬如timing_4342表示正点原子4.3寸480*272屏幕所对应的时序参数,其它的timing节点同样也是如此。支持的LCD屏包括正点原子推出的4.3寸800*480和4.3寸480*272、7寸800*480、7寸1024*600以及10.1寸1280*800。
配置完了设备树之后,保存退出,接下来就编译Petalinux工程了。
       1.5编译Petalinux工程
       现在我们编译整个Petalinux工程,在终端输入如下命令:
  1. petalinux-build
复制代码
       执行结果如下图所示:
第九章 Linux显示设备的使用13249.png

图 9.5.1 编译petalinux工程

       1.6制作BOOT.BIN启动文件并复制到SD卡
       使用下面命令生成 BOOT文件:
  1. petalinux-package --boot --fsbl --fpga --u-boot --force
复制代码
       执行结果如下图所示:
第九章 Linux显示设备的使用13422.png

图 9.6.1 生成BOOT文件

       将image/linux目录下的BOOT.BIN和image.ub文件拷贝到SD启动卡的第一个分区,也就是FAT32分区,如下图所示:
第九章 Linux显示设备的使用13552.png

图 9.6.2 拷贝镜像文件到SD卡

       拷贝完成之后,现在可以卸载SD卡了。
       1.7在开发板上启动Linux
       将SD卡插入领航者开发板的SD卡槽,然后通过USB Type-C连接线将开发板USB调试串口与电脑USB口相连,连接电源线、设置开发板启动模式为SD Card,使用软排线将LCD屏连接到开发板,接下来打开电源开关、启动开发板,连接串口终端,打印信息如下所示:
第九章 Linux显示设备的使用13778.png

图 9.7.1 内核启动打印信息

       启动成功之后,LCD屏将会作为终端出现用户登录提示信息:
第九章 Linux显示设备的使用13869.png

图 9.7.2 LCD屏显示信息

        此时可以在领航者开发板USB HOST接口上连接一副USB键盘,使用键盘输入用户名和密码就可以登录Linux系统了(登录的用户名为root,密码为:root),登录成功之后大家就可以通过LCD终端来进行相关的操作了,譬如输入Linux命令、执行Linux命令并打印显示Linux命令运行结果,此处我们就不演示了。
        至此我们完成了本章的内容。

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-7-2 04:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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