内核启动期间/之后Weston启动前显示启动画面的AMD DRM技术咨询
关于AMD DRM下早期启动画面的问题解答
问题1:为使早期framebuffer正常工作,需在DRM或AMD DRM驱动中启用特定选项吗?
是的,需要配置以下内核选项和启动参数:
- 内核编译时必须开启
CONFIG_DRM_FBDEV_EMULATION:这是DRM框架提供的fbdev模拟层,现代DRM驱动(包括amdgpu)默认不原生提供fbdev节点,依赖这个选项创建/dev/fb0。 - 开启
CONFIG_DRM_AMDGPU:确保AMDGPU驱动被编译进内核(或作为模块提前加载,比如在initramfs中),嵌入式场景建议直接编译进内核,保证启动早期就能加载驱动。 - 可选内核启动参数
amdgpu.fbdev=1:强制amdgpu驱动初始化fbdev模拟层,部分场景下默认不会自动触发初始化,添加该参数可确保/dev/fb0在驱动加载后立即出现。 - 若早期启动阶段fbdev无输出,可尝试添加
amdgpu.dc=0:禁用AMD的Display Controller(DC)模块,切换到旧显示路径,部分老型号GPU或特殊启动场景需要此设置。
问题2:是否存在amd-drm在用户空间启用流水线前不支持fbdev写入访问的已知限制?
存在这类限制:
- 现代amdgpu驱动的fbdev模拟层依赖DRM流水线初始化,默认情况下驱动加载后不会自动启动流水线,需用户空间程序(如fbv、自定义工具)打开DRM设备并设置显示模式后,fbdev节点才处于可写状态。
- 未启用
CONFIG_DRM_FBDEV_EMULATION或未添加amdgpu.fbdev=1参数时,/dev/fb0可能根本不会创建,自然无法写入。 - 后续启动Weston等合成器时,它们会独占DRM设备并接管流水线,此时fbdev节点会失效,无法再写入数据。
- 若amdgpu驱动以模块形式加载,模块完成加载前fbdev节点不可用,因此早期启动画面工具需等待驱动加载完成后再执行。
问题3:有无无需Weston直接在AMD DRM上使用fb0显示原始图像的示例?
以下是一个简单的C语言示例,直接向/dev/fb0写入纯色画面,无需依赖Weston:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <linux/fb.h> #include <sys/ioctl.h> int main() { int fb_fd = open("/dev/fb0", O_RDWR); if (fb_fd < 0) { perror("Failed to open fb0"); return 1; } struct fb_var_screeninfo var_info; if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &var_info) < 0) { perror("Failed to get var screen info"); close(fb_fd); return 1; } struct fb_fix_screeninfo fix_info; if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &fix_info) < 0) { perror("Failed to get fix screen info"); close(fb_fd); return 1; } // 计算屏幕缓冲区大小 long screen_size = var_info.xres * var_info.yres * var_info.bits_per_pixel / 8; char *fb_buffer = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0); if (fb_buffer == MAP_FAILED) { perror("Failed to mmap fb buffer"); close(fb_fd); return 1; } // 填充红色画面(假设fb为RGB565格式,需根据实际格式调整) unsigned short red = 0xF800; // RGB565格式的红色值 for (int i = 0; i < screen_size / 2; i++) { ((unsigned short *)fb_buffer)[i] = red; } munmap(fb_buffer, screen_size); close(fb_fd); return 0; }
编译运行:
gcc fb_test.c -o fb_test sudo ./fb_test
注意事项:
- 运行程序需要root权限,
/dev/fb0默认仅root可读写。 - 可通过
fbset命令查看当前fb的像素格式,调整代码中的颜色值以匹配实际格式(如RGB888、ARGB32等)。 - 若要显示自定义原始图像,需将图像转换为与fb像素格式一致的raw格式,再直接读取文件内容写入fb缓冲区即可。
内容的提问来源于stack exchange,提问作者Malin Shaik
相关产品推荐
相关产品推荐

