黑金ZYNQ7100配置HDMI驱动并测试

Linux系统移植系列

Linux系统移植专栏地址 https://blog.csdn.net/qq_41873311/category_12127932.html

一个写了五篇博客,成功在黑金ZYNQ7100搭建了属于我自己的Linux系统
但是缺少显示模块,所以本文就配置个HDMI驱动来完成图像的显示

环境

  1. hdf设计:vivado 2017.4套件
  2. 交叉编译环境: arm-linux-gnueabihf-
  3. 虚拟机Linux系统版本:ubuntu 16.04
  4. 开发板:ALINX AX7Z100 开发板(ZYNQ7100)
  5. 内核源码版本2017.4,版本4.9

资源文件下载

本文涉及的资源文件已上传至我的github仓库 https://github.com/Huge-Hammer/linux-system-porting/tree/main/Drivers/HDMI

配置clk-dglnt-dynclk

进入 /drivers/clk 目录下

复制驱动源码 clk-dglnt-dynclk.c

修改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.

修改Makefile,在 # hardware specific clock types下添加如下配置项

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

配置digilent_encoder

进入 /drivers/gpu/drm/xilinx 目录下

复制驱动源码 ax_7511_encoder.c 、digilent_encoder.c、ax_lcd_encoder.c

修改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.

config DRM_AX_LCD_ENCODER
   tristate "ALINX LCD DRM Encoder Driver"
   depends on DRM_XILINX
   help
     DRM slave encoder for alinx heijin LCD.

config DRM_AX_7511_ENCODER
   tristate "ALINX 7511 Encoder Driver"
   depends on DRM_XILINX
   help
     ADV7511 encoder.

修改Makefile,在后面添加如下配置项

obj-$(CONFIG_DRM_DIGILENT_ENCODER) += digilent_encoder.o
obj-$(CONFIG_DRM_AX_LCD_ENCODER) += ax_lcd_encoder.o
obj-$(CONFIG_DRM_AX_7511_ENCODER) += ax_7511_encoder.o

配置并编译内核

执行 Linux系统移植三:移植Kernel生成zImage和dtb文件(非petalinux版)一文中 编译zImage 的脚本 zynq_kernel_gen.sh

./zynq_kernel_gen.sh

进入GUI内核配置界面进行配置

  1. 找到 Device Drivers–>Graphics support–>Xilinx DRM,选择 ALINX 7511 Encoder Driver,按 y

黑金ZYNQ7100配置HDMI驱动并测试
  1. 找到 Device Drivers–>Common Clock Framework,选择Digilent axi_dynclk Driver,按 y

黑金ZYNQ7100配置HDMI驱动并测试
  1. 找到 Device Drivers–>Graphics support–>Console display drive support,enter进入,按空格取消 Framebuffer Console support
    即取消控制台在显示器显示支持,这一步根据个人需求配置

黑金ZYNQ7100配置HDMI驱动并测试
  1. 找到 Device Drivers–>Multimedia support–>Media USB Adapters,按y 选择,enter进入,按y 选择 USB Video Class (UVC)
    即添加UVC驱动,这一步根据个人需求配置

黑金ZYNQ7100配置HDMI驱动并测试
  1. 保存配置退出

接下来脚本会自动编译 zImagedtb 文件,然后拷贝文件到sd卡即可

测试HDMI驱动

连接HDMI和显示器,启动板子,插上鼠标和摄像头,启动板子

黑金ZYNQ7100配置HDMI驱动并测试

接下来跑程序试试效果,之前写过一个几个linux程序,本文主要用到的是 显示jpeg图片

源码和可执行文件在这里,可自行下载使用Linux Framebuffer显示demo——jpeg图像显示

在那之前先看看显示器的信息,新建文件 fb_info.c ,写入以下内容

#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
    struct fb_fix_screeninfo fb_fix;
    struct fb_var_screeninfo fb_var;
    int fd;

    if (0 > (fd = open("/dev/fb0", O_WRONLY))) {
        perror("open error");
        exit(-1);
    }

    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);
    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);
    printf("分辨率: %d*%d\n"
        "像素深度bpp: %d\n"
        "一行的字节数: %d\n"
        "像素格式: R G B\n",
        fb_var.xres, fb_var.yres, fb_var.bits_per_pixel,
        fb_fix.line_length,
        fb_var.red.offset, fb_var.red.length,
        fb_var.green.offset, fb_var.green.length,
        fb_var.blue.offset, fb_var.blue.length);

    close(fd);
    exit(0);
}

交叉编译成可执行文件 fb_info ,然后用scp命令拷贝到板子上

arm-linux-gnueabihf-gcc -o fb_info fb_info.c

运行结果,可以看到分辨率是1680*1050

黑金ZYNQ7100配置HDMI驱动并测试

网上找一张分辨率是1680*1050的风景图片,运行 jpeg 显示程序

黑金ZYNQ7100配置HDMI驱动并测试

看一下显示器,显示成功,说明HDMI驱动配置成功

黑金ZYNQ7100配置HDMI驱动并测试

遇到的问题

usb 设备总是断开又重启,先记录着再说,留着解闷吧

黑金ZYNQ7100配置HDMI驱动并测试

; 参考文档

ZYNQ #1 – PL端模拟HDMI信号输出环境下的Linux界面显示
ZYNQ平台的HDMI驱动测试

Original: https://blog.csdn.net/qq_41873311/article/details/128176199
Author: 爱学习的诸葛铁锤
Title: 黑金ZYNQ7100配置HDMI驱动并测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/813629/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球