libdrm 编译
cd $LFS/src
wget https://dri.freedesktop.org/libdrm/libdrm-2.4.112.tar.xz
tar -xvf libdrm-2.4.112.tar.xz
cd libdrm-2.4.112
# 创建 cross_file.txt 用于配置交叉编译环境, 文件内容见下文
vim cross_file.txt
meson build \
--prefix=$LFS/rootfs \
--cross-file=cross_file.txt \
-D amdgpu=false \
-D cairo-tests=false \
-D etnaviv=false \
-D exynos=true \
-D freedreno=false \
-D freedreno-kgsl=false \
-D install-test-programs=true \
-D intel=false \
-D libkms=false \
-D man-pages=false \
-D nouveau=false \
-D omap=false \
-D radeon=false \
-D tegra=false \
-D udev=false \
-D valgrind=false \
-D vc4=false \
-D vmwgfx=false
cd build
ninja && ninja install
cross_file.txt 文件内容
[binaries]
c = 'arm-linux-gnueabi-gcc'
cpp = 'arm-linux-gnueabi-gcc'
ar = 'arm-linux-gnueabi-ar'
strip = 'arm-linux-gnueabi-strip'
[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'
[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'
更新系统镜像
sudo mount -o loop $LFS/dst/rootfs.img /mnt
sudo cp $LFS/rootfs/* /mnt -r
sudo umount /mnt
加载系统 (去掉 -nographic)
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel $LFS/dst/zImage \
-dtb $LFS/dst/vexpress-v2p-ca9.dtb \
-sd $LFS/dst/rootfs.img \
-append "root=/dev/mmcblk0 rw console=ttyAMA0"
执行测试
执行测试前首先查看程序需要依赖哪些库, 必须保证根文件系统的动态库中包含它们
$ readelf -d $LFS/rootfs/bin/modetest | grep 'NEEDED'
0x00000001 (NEEDED) 共享库:[libdrm.so.2]
0x00000001 (NEEDED) 共享库:[libpthread.so.0]
0x00000001 (NEEDED) 共享库:[libc.so.6]
0x00000001 (NEEDED) 共享库:[ld-linux.so.3]
首先执行 modetest
可以看到 modetest 试图枚举所有可能的图形卡, 然后最终找到 pl111 是可工作的, 这是因为 vexpress-v2p-ca9 的 gpu 是 pl111
# 通过 --help 获得帮助
modetest --help
# 可知执行测试程序的格式, 由此执行如下测试
modetest -M pl111 -s 34@32:1024x768
执行后在 QEMU View 菜单里面切换到 pl111 界面, 可以看到显示如下, 说明测试成功, 设备正常运行: