修改这个图片
sysdrv/source/kernel/logo.bmp
build.sh构建内核就好
| 阶段 | 问题描述 | 根因分析 | 解决方案 | 当前状态 |
|---|---|---|---|---|
| U-Boot 显示 logo | U-Boot 阶段屏幕 logo 正常显示 | 无异常 | - | 正常 |
| 内核启动 logo 消失 | 切换内核瞬间开机 logo 黑屏消失 | U-Boot panel 驱动配置错误video,flags,参数配置为 CSYNC,正确应为 NHSYNC;导致内核rockchip_drm_logo.c屏幕模式匹配失败,CRTC 显示通道被关闭 | 修改修复 U-Boot 驱动文件panel-lh24030c50.c内同步标志位配置 | 已修复 |
| 内核持续显示 logo | 修复 U-Boot 驱动后,开机 logo 可从 U-Boot 阶段平滑过渡至内核阶段,无黑屏断层 | 驱动同步参数修正后,内核rockchip_drm_show_logo()可正常无缝承接画面输出 | 重新编译烧录 U-Boot 固件即可生效 | 验证通过 |
文件路径:
rv1106/sysdrv/source/kernel/drivers/gpu/drm/rockchip/rockchip_drm_logo.c
匹配逻辑在 setup_initial_state() 函数,核心是 679-689 行:
679: list_for_each_entry(mode, &connector->modes, head) {
680: if (mode->clock == set->clock && // 7MHz
681: mode->hdisplay == set->hdisplay && // 240
682: mode->vdisplay == set->vdisplay && // 320
683: mode->crtc_hsync_end == set->crtc_hsync_end && // 288
684: mode->crtc_vsync_end == set->crtc_vsync_end && // 332
685: drm_mode_vrefresh(mode) == set->vrefresh && // 70
689: mode->flags == (set->flags & DRM_MODE_FLAG_ALL) // ← 这里
690: ) {
691: found = 1;
692: match = 1;
693: break;
694: }
695: }
697: if (!found) {
698: ret = -EINVAL;
700: dev_err(..., "can't found any match mode\n"); // 不匹配 → CRTC 关闭
709: goto error_conn;
710: }
- mode = 内核面板模式(来自 DTS timer,flags=NHSYNC|NVSYNC=0x0A)
- set = U-Boot 写入 route 节点的模式(flags=NVSYNC|CSYNC=0x48 → 不匹配)
- 689 行 flag 严格相等比较失败 → found=0 → 697 行走 error 路径 → CRTC 被关闭、屏幕灭
需要修改
内核配置
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_VT=y
内核启动时会调用 rockchip_drm_show_logo() → 它从 U-Boot 继承了 456K 的启动 logo 数据,并通过 DRM atomic commit 把 CRTC 配置为扫描 logo 所在的 framebuffer(rockchip_drm_logo.c:897-1094)。 同时 rockchip_drm_fbdev_init() 创建了 /dev/fb0,分配了一个独立的 fbdev framebuffer(在 CMA 内存中)。 re005 打开 /dev/fb0 写入像素 → 写入的是 fbdev 的 framebuffer,但 CRTC 仍在扫描 logo 的 framebuffer,所以屏幕不更新。