RK3568 开发板 Buildroot 环境下内核 Logo 动画效果配置实操指南

原创 作者 Forlinx 2026-02-10 16:25:00 RK3568 RK3568开发板 Logo动画效果
本文为 OK3568-C开发板(基于瑞芯微RK3568处理器设计) 4.19.206 Buildroot 环境下添加内核 Logo 动画的实操指南,聚焦RK3568开发板启动 Logo 动画的完整实现流程。从动画帧图片的格式转换与重命名,到文件部署至内核指定目录,再到 Makefile、logo.c 等核心文件的配置修改,最后完成编译验证,步骤清晰且实操性强,按指引操作可实现 25 帧居中循环、每帧延时 50ms 的 Logo 动画效果。 瑞芯微RK3568

一、准备工作:图片格式转换

需提前准备动画所需的 连续序列图片(建议 25 张,对应动画帧 00-24),并按以下命令转换为内核支持的 ppm 格式:

1.1 PNG格式转换

若图片为 PNG 格式,使用以下命令转换:

pngtopnm logo.png > logo.pnm

1.2 BMP格式转换

若图片为 BMP 格式,使用以下命令转换:

bmptopnm logo.bmp > logo.pnm

1.3 统一转为224色ppm格式

将转换后的图片统一处理为内核支持的224色ppm格式:

pnmquant 224 logo.pnm > logo224.pnm
pnmtoplainpnm logo224.pnm > logo_linuxXX_clut224.ppm
命名规范

XX 需替换为 00-24(对应 25 帧动画,如 logo_linux00_clut224.ppm、logo_linux01_clut224.ppm)。

二、文件部署:拷贝至内核指定目录

将转换后的 25 张logo_linuxXX_clut224.ppm图片,拷贝到内核源码的 logo 驱动目录:

内核logo目录文件列表示意图
图1:内核logo目录文件部署结构

OK3568-linux-source/kernel/drivers/video/logo/

三、配置修改:核心文件编辑

(一)修改 Makefile(编译规则添加)

编辑 Makefile,添加新增图片的编译规则,确保 25 帧图片被内核编译:

OK3568-linux-source/kernel/drivers/video/logo/Makefile

Makefile修改示意图
图2:Makefile中添加25帧图片编译规则

(二)修改 logo.c(帧切换逻辑)

编辑 logo.c,修正语法错误并添加帧序列匹配逻辑:

OK3568-linux-source/kernel/drivers/video/logo/logo.c

drivers/video/logo/logo.c
diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
index 36aa050f9..71ce3bade 100644
--- a/drivers/video/logo/logo.c
+++ b/drivers/video/logo/logo.c
@@ -43,6 +43,8 @@ late_initcall_sync(fb_logo_late_init);
 const struct linux_logo *fb_find_logo(int depth)
 {
 	const struct linux_logo *logo = NULL;
+	int num = depth >> 16;
+	depth &= 0xFFFF;
 	if (nologo || logos_freed)
 		return NULL;
@@ -72,7 +74,34 @@ const struct linux_logo *_ref fb_find_logo(int depth)
 	if (depth >= 8) {
 #ifdef CONFIG_LOGO_LINUX_CLUT224
 		/* Generic Linux Logo */
-		logo = &logo_linux_clut224;
+		// logo = &logo_linux_clut224;
+		switch (num) {
+		case 0: logo = &logo_linux00_clut224; break;
+		case 1: logo = &logo_linux01_clut224; break;
+		case 2: logo = &logo_linux02_clut224; break;
+		case 3: logo = &logo_linux03_clut224; break;
+		case 4: logo = &logo_linux04_clut224; break;
+		case 5: logo = &logo_linux05_clut224; break;
+		case 6: logo = &logo_linux06_clut224; break;
+		case 7: logo = &logo_linux07_clut224; break;
+		case 8: logo = &logo_linux08_clut224; break;
+		case 9: logo = &logo_linux09_clut224; break;
+		case 10: logo = &logo_linux10_clut224; break;
+		case 11: logo = &logo_linux11_clut224; break;
+		case 12: logo = &logo_linux12_clut224; break;
+		case 13: logo = &logo_linux13_clut224; break;
+		case 14: logo = &logo_linux14_clut224; break;
+		case 15: logo = &logo_linux15_clut224; break;
+		case 16: logo = &logo_linux16_clut224; break;
+		case 17: logo = &logo_linux17_clut224; break;
+		case 18: logo = &logo_linux18_clut224; break;
+		case 19: logo = &logo_linux19_clut224; break;
+		case 20: logo = &logo_linux20_clut224; break;
+		case 21: logo = &logo_linux21_clut224; break;
+		case 22: logo = &logo_linux22_clut224; break;
+		case 23: logo = &logo_linux23_clut224; break;
+		case 24: logo = &logo_linux24_clut224; break;
+		}
 #endif
 #ifdef CONFIG_LOGO_DEC_CLUT224
 		/* DEC Linux logo (on MIPS/MIPS64 or ALPHA) */

(三)修改 linux_logo.h(结构体声明)

编辑 linux_logo.h,修正语法错误并声明 25 帧图片结构体:

OK3568-linux-source/kernel/include/linux/linux_logo.h

include/linux/linux_logo.h
diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h
index d4d5b93ef..b0ffc168b 100644
--- a/include/linux/linux_logo.h
+++ b/include/linux/linux_logo.h
@@ -35,7 +35,32 @@ struct linux_logo {
 extern const struct linux_logo logo_linux_mono;
 extern const struct linux_logo logo_linux_vga16;
-extern const struct linux_logo logo_linux_clut224;
+// extern const struct linux_logo logo_linux_clut224;
+extern const struct linux_logo logo_linux00_clut224;
+extern const struct linux_logo logo_linux01_clut224;
+extern const struct linux_logo logo_linux02_clut224;
+extern const struct linux_logo logo_linux03_clut224;
+extern const struct linux_logo logo_linux04_clut224;
+extern const struct linux_logo logo_linux05_clut224;
+extern const struct linux_logo logo_linux06_clut224;
+extern const struct linux_logo logo_linux07_clut224;
+extern const struct linux_logo logo_linux08_clut224;
+extern const struct linux_logo logo_linux09_clut224;
+extern const struct linux_logo logo_linux10_clut224;
+extern const struct linux_logo logo_linux11_clut224;
+extern const struct linux_logo logo_linux12_clut224;
+extern const struct linux_logo logo_linux13_clut224;
+extern const struct linux_logo logo_linux14_clut224;
+extern const struct linux_logo logo_linux15_clut224;
+extern const struct linux_logo logo_linux16_clut224;
+extern const struct linux_logo logo_linux17_clut224;
+extern const struct linux_logo logo_linux18_clut224;
+extern const struct linux_logo logo_linux19_clut224;
+extern const struct linux_logo logo_linux20_clut224;
+extern const struct linux_logo logo_linux21_clut224;
+extern const struct linux_logo logo_linux22_clut224;
+extern const struct linux_logo logo_linux23_clut224;
+extern const struct linux_logo logo_linux24_clut224;
 extern const struct linux_logo logo_dec_clut224;
 extern const struct linux_logo logo_mac_clut224;
 extern const struct linux_logo logo_parisc_clut224;

(四)修改 defconfig(内核配置启用)

编辑 defconfig,启用 Logo 功能(删除冗余声音配置):

OK3568-linux-source/arch/arm64/configs/OK3568-C-linux_defconfig

arch/arm64/configs/OK3568-C-linux_defconfig
diff --git a/arch/arm64/configs/OK3568-C-linux_defconfig b/arch/arm64/configs/OK3568-C-linux_defconfig
index 97d46ceff..d5af9f21d 100644
--- a/arch/arm64/configs/OK3568-C-linux_defconfig
+++ b/arch/arm64/configs/OK3568-C-linux_defconfig
@@ -590,3 +590,18 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=60
 CONFIG_FUNCTION_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
 CONFIG_LKDTM=y
+
+#
+# Console display driver support
+#
+CONFIG_FONT_8x8=n
+CONFIG_VGA_CONSOLE=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=n
+CONFIG_LOGO_LINUX_VGA16=n
+CONFIG_LOGO_LINUX_CLUT224=y
配置项 说明
CONFIG_FRAMEBUFFER_CONSOLE=y 启用帧缓冲控制台
CONFIG_LOGO=y 启用Logo显示功能
CONFIG_LOGO_LINUX_CLUT224=y 启用224色Linux Logo
CONFIG_LOGO_LINUX_MONO=n 禁用单色Logo
CONFIG_LOGO_LINUX_VGA16=n 禁用VGA16色Logo

(五)修改 fbcon.c(动画播放逻辑)

编辑 fbcon.c,添加帧循环播放和延时逻辑:

OK3568-linux-source/kernel/drivers/video/fbdev/core/fbcon.c

drivers/video/fbdev/core/fbcon.c
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index bf7959fdf..2607ac9cb 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -569,6 +569,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
 	if (fb_get_color_depth(&info->var, &info->fix) == 1)
 		erase &= ~0x400;
 	logo_height = fb_prepare_logo(info, ops->rotate);
+	logo_height += (info->var.yres / 2) - (logo_height / 2); // 垂直居中
 	logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
 	q = (unsigned short *) (vc->vc_origin +
 				vc->vc_size_row * rows);
@@ -2037,6 +2038,8 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
 	return 0;
 }
 
+extern int fb_get_logo(struct fb_info *info, int num);
+
 static int fbcon_switch(struct vc_data *vc)
 {
 	struct fb_info *info, *old_info = NULL;
@@ -2158,7 +2161,14 @@ static int fbcon_switch(struct vc_data *vc)
 		logo_shown = fg_console;
 		/* This is protected above by initmem_freed */
-		fb_show_logo(info, ops->rotate);
+		// fb_show_logo(info, ops->rotate);
+#if 1
+		int i;
+		for (i = 0; i < 25; i++) { // 循环播放 25 帧 + fb_get_logo(info, i); + fb_show_logo(info, ops->rotate);
+			msleep(50); // 每帧延时 50ms,可调整动画速度
+		}
+#endif
 		update_region(vc,
 			      vc->vc_origin + vc->vc_size_row * vc->vc_top,
 			      vc->vc_size_row * (vc->vc_bottom - vc->vc_top));
动画参数调整

可通过修改msleep(50)的值来调整动画播放速度,数值越小动画越快,建议范围 30-100ms。

(六)修改 fbmem.c(Logo 位置与函数导出)

编辑 fbmem.c,修正 Logo 显示位置并导出 fb_get_logo 函数:

OK3568-linux-source/kernel/drivers/video/fbdev/core/fbmem.c

drivers/video/fbdev/core/fbmem.c
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index 7a70e7b80..63cfad4c0 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -509,10 +509,10 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
 		fb_set_logo(info, logo, logo_new, fb_logo.depth);
 	}
 
-	image.dx = 0;
-	image.dy = y;
 	image.width = logo->width;
 	image.height = logo->height;
+	image.dx = (info->var.xres / 2) - (logo->width / 2); // 水平居中
+	image.dy = (info->var.yres / 2) - (logo->height / 2); // 垂直居中
 
 	if (rotate) {
 		logo_rotate = kmalloc_array(logo->width, logo->height,
@@ -681,12 +681,25 @@ int fb_show_logo(struct fb_info *info, int rotate)
 	return y;
 }
 
+int fb_get_logo(struct fb_info *info, int num)
+{
+	int depth = fb_get_color_depth(&info->var, &info->fix);
+	depth |= num << 16; + fb_logo.logo = fb_find_logo(depth); + if (!fb_logo.logo) { + return -1; + } + return 0; +} #else int fb_prepare_logo(struct fb_info *info, int rotate) { return 0; } int fb_show_logo(struct fb_info *info, int rotate) { return 0; } +int fb_get_logo(struct fb_info *info, int num) { return 0; } #endif /* CONFIG_LOGO */ EXPORT_SYMBOL(fb_prepare_logo); EXPORT_SYMBOL(fb_show_logo); +EXPORT_SYMBOL(fb_get_logo);

(七)修改 bitblit.c(隐藏光标)

编辑 bitblit.c,禁用光标显示避免影响动画效果:

OK3568-linux-source/kernel/drivers/video/fbdev/core/bitblit.c

drivers/video/fbdev/core/bitblit.c
diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c
index 436365efa..e8e874653 100644
--- a/drivers/video/fbdev/core/bitblit.c
+++ b/drivers/video/fbdev/core/bitblit.c
@@ -373,7 +373,8 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 	if (info->fbops->fb_cursor)
 		err = info->fbops->fb_cursor(info, &cursor);
 
-	if (err)
+	// if (err) // 禁用软光标
+	if (0)
 		soft_cursor(info, &cursor);
 
 	ops->cursor_reset = 0;

四、编译验证

完成所有修改后,执行内核编译命令,生成新的镜像文件并烧录到 RK3568 开发板,启动开发板即可看到居中播放的 Logo 动画(25 帧循环,每帧延时 50ms)。

编译内核
执行 make 命令编译内核,生成 boot.img
烧录镜像
将编译生成的镜像烧录到开发板
启动验证
重启开发板,观察开机Logo动画效果
编译参考

详细编译方法请参考飞凌嵌入式提供的《OK3568编译手册》。

咨询立即获得专属报价

华北区负责人二维码

华北区负责人

华东区负责人二维码

华东区负责人

华南区负责人二维码

华南区负责人

中西区负责人二维码

中西区负责人

相关产品 >

  • FET3568-C核心板

    RK3568性能强而稳 国产芯|飞凌嵌入式RK3568系列核心板,采用瑞芯微国产高性能AI处理器RK3568设计生产,RK3568兼具CPU、GPU、NPU、VPU于一身,RK3568 性能、性价比在同类产品中具有较高优势,RK3568处理器是一款定位中高端的通用型SoC, 飞凌RK3568核心板主要面向工业互联网、HMI、NVR存储、车载中控、工业网关等领域。目前RK3568系列已经批量稳定出货

    了解详情
    FET3568-C核心板
  • OK3568-C开发板

    强而稳,国产芯,1Tops算力,多路高速接口|飞凌RK3568系列RK3568开发板基于国产工业级AI处理器RK3568四核64位Cortex-A55 处理器设计。RK3568作为国产化高性能处理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU达到1Tops,飞凌RK3568系列核心板提供瑞芯微RK3568规格书_datasheet_数据手册_原理图等,


    了解详情
    OK3568-C开发板

推荐阅读 换一批 换一批