You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核启动期间/之后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:37