Linux系统移植系列
Linux系统移植专栏地址 https://blog.csdn.net/qq_41873311/category_12127932.html
一个写了五篇博客,成功在黑金ZYNQ7100搭建了属于我自己的Linux系统
但是缺少显示模块,所以本文就配置个HDMI驱动来完成图像的显示
环境
- hdf设计:vivado 2017.4套件
- 交叉编译环境: arm-linux-gnueabihf-
- 虚拟机Linux系统版本:ubuntu 16.04
- 开发板:ALINX AX7Z100 开发板(ZYNQ7100)
- 内核源码版本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内核配置界面进行配置
- 找到 Device Drivers–>Graphics support–>Xilinx DRM,选择 ALINX 7511 Encoder Driver,按 y
- 找到 Device Drivers–>Common Clock Framework,选择Digilent axi_dynclk Driver,按 y
- 找到 Device Drivers–>Console display drive support,enter进入,按空格取消 Framebuffer Console support
即取消控制台在显示器显示支持,这一步根据个人需求配置
- 找到 Device Drivers–>Multimedia support–>Media USB Adapters,按y 选择,enter进入,按y 选择 USB Video Class (UVC)
即添加UVC驱动,这一步根据个人需求配置
- 保存配置退出
接下来脚本会自动编译 zImage
和 dtb
文件,然后拷贝文件到sd卡即可
测试HDMI驱动
连接HDMI和显示器,启动板子,插上鼠标和摄像头,启动板子
接下来跑程序试试效果,之前写过一个几个linux程序,本文主要用到的是 显示jpeg图片
源码和可执行文件在这里,可自行下载使用Linux Framebuffer显示demo——jpeg图像显示
在那之前先看看显示器的信息,新建文件 fb_info.c
,写入以下内容
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
int main(int argc, char *argv[])
{
struct fb_fix_screeninfo fb_fix;
struct fb_var_screeninfo fb_var;
int fd;
/* 打开framebuffer设备 */
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<%d %d> G<%d %d> B<%d %d>\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
网上找一张分辨率是1680*1050的风景图片,运行 jpeg 显示程序
看一下显示器,显示成功,说明HDMI驱动配置成功
遇到的问题
usb 设备总是断开又重启,先记录着再说,留着解闷吧
参考文档
ZYNQ #1 - PL端模拟HDMI信号输出环境下的Linux界面显示
ZYNQ平台的HDMI驱动测试