在MPSoC系列开发板上移植Ubuntu22.04桌面系统时,你是否遇到过这样的窘境:编译、烧录全流程无报错,但启动后显示屏始终黑屏,查看Xorg日志才发现一行关键错误 ——‘Failed to load module "armsoc" (module does not exist, 0)’?
这正是缺少了ARM架构专属的Xorg显示驱动库armsoc_drv.so所致。不同于在 7020系列开发板移植Ubuntu16.04时‘装完图形界面就能亮屏’的顺畅,Ubuntu22.04因内核驱动框架迭代,让这个‘小文件’成了显示启动的‘拦路虎’。本文从‘是什么、为什么要、怎么拿’三个维度,带你彻底解决这个黑屏难题。
1. armsoc_drv.so是什么
armsoc_drv.so是一个专门为ARM架构平台定制的Xorg显示服务器驱动模块。它本质上是一个动态链接库文件,作用是让Xorg显示服务器能够和ARM SoC芯片内部的显示硬件正确交互。
在图形界面运行过程中,Xorg会把窗口绘制、刷新等操作下发给armsoc驱动模块,由它再转换为底层硬件能够理解的指令(例如分辨率设置、帧缓冲管理、刷新控制等)。
换句话说,armsoc_drv.so就是Xorg与ARM SoC显示硬件之间的“翻译器”。
如果你曾移植过Ubuntu16.04(Linux 4.14内核),会发现根本不用管这个文件——因为当时依赖的是fbdev驱动(相当于“简单快递员”,直接把数据丢进frame buffer就能显示);
但Ubuntu22.04搭载的高版本内核已将fbdev转为“兼容层”,主力驱动框架换成了DRM(Direct Rendering Module),而armsoc_drv.so正是对接DRM的“专业翻译”。
2. 为什么到Ubuntu22.04上就需要使用它了
为什么在Ubuntu22.04上需要使用armsoc_drv.so?其实在上一节就已经说出部分原因了——就是由于Linux内核版本的更新迭代fbdev不再被主流大众所使用了,现在主流的Linux显示驱动框架是DRM(Direct Rendering Module)。
所以这里我们采用armsoc_drv.so作为Xorg的显示驱动模块,用来对接内核DRM并驱动底层显示控制器。
当然如果你想要使用fbdev也是可以的,在DRM框架下,内核仍会提供/dev/fb0节点,以兼容依赖fbdev的旧程序。
3. 如何获取到armsoc_drv.so
如果要使用armsoc_drv.so文件的话那么该如何获取呢?一般来说我们会优先在官方apt安装包里去寻找,如果找不到就再去寻找源码包手动构建安装,这里我们先尝试方法一看看官方安装包里是否包含:
直接使用Ubuntu自带的apt下载输入如下指令,但是很遗憾,此方法生成的armsoc_drv.so文件无法直接使用,如果强行使用就会出现如下问题:
apt install xserver-xorg-video-armsoc-endlessm
如果是较早版本Ubuntu(22.04之前)可能要使用如下指令:
apt install xserver-xorg-video-armsoc
安装完成之后就会在/usr/lib/aarch64-linux-gnu/xorg/modules/drivers下生成一个armsoc_drv.so文件。但是经过测试这个文件无法被Xorg使用,所以这里只能执行第二种方法,即找到源码,通过手动编译的方式进行构建,来去规避这个错误。
下载源码包构建动态库文件
到如下链接下载armsoc_drv.so源码包:
https://github.com/ikwzm/xf86-video-armsoc-xilinx
通过GitHub页面的信息我们可以知晓构建方法。
首先将源码包解压了之后进入到源码包目录下打开终端输入如下指令安装需要的工具:
sudo apt install libdrm-dev libudev-dev libxext-dev pkg-config x11proto-core-dev x11proto-fonts-dev x11proto-gl-dev x11proto-xf86dri-dev xutils-dev xserver-xorg-dev quilt dh-autoreconf debhelper
切换到开发板上的终端运行autogen.sh脚本生成Makefile和configure文件:
运行脚本后会生成很多配置文件和脚本文件:
这里先清理一下工程,然后再生成动态库文件,指令如下:
make distcleansudo debian/rules binary
构建完成后退到上一层目录进行打包:
cd ..dpkg --info xserver-xorg-video-armsoc-xilinx_1.4-2_arm64.deb
最后就是安装部分了,输入如下指令进行安装:
sudo dpkg -i xserver-xorg-video-armsoc-xilinx_1.4-2_arm64.deb
这里就算安装成功了,输入如下指令查看安装的armsoc包:
dpkg --list | grep xserver-xorg-video-armsoc
最后再重启一下就可以点亮屏幕了,并且日志文件也没有报错:
总结
这里我们小小总结一下
● 在Ubuntu系统(尤其22.04)中,可以通过apt安装这类驱动包能自动处理依赖、生成标准配置并支持系统维护,但是如果在官方包适配不足的场景下手动寻找源码构建可能会是更好的选择;
● Ubuntu 16.04无需专门安装该驱动,是因当时依赖fbdev等通用驱动、移植镜像多预集成驱动且适配低版本的Linux设备,而Linux内核源码版本升级、适配中高版本的Linux设备需专用驱动。

