RK3568 開(kāi)發(fā)板 Buildroot 環(huán)境下內(nèi)核 Logo 動(dòng)畫(huà)效果配置實(shí)操指南
Forlinx
2026-02-10 16:25:00
RK3568
RK3568開(kāi)發(fā)板
Logo動(dòng)畫(huà)效果
一、準(zhǔn)備工作:圖片格式轉(zhuǎn)換
需提前準(zhǔn)備動(dòng)畫(huà)所需的 連續(xù)序列圖片(建議 25 張,對(duì)應(yīng)動(dòng)畫(huà)幀 00-24),并按以下命令轉(zhuǎn)換為內(nèi)核支持的 ppm 格式:
1.1 PNG格式轉(zhuǎn)換
若圖片為 PNG 格式,使用以下命令轉(zhuǎn)換:
pngtopnm logo.png > logo.pnm
1.2 BMP格式轉(zhuǎn)換
若圖片為 BMP 格式,使用以下命令轉(zhuǎn)換:
bmptopnm logo.bmp > logo.pnm
1.3 統(tǒng)一轉(zhuǎn)為224色ppm格式
將轉(zhuǎn)換后的圖片統(tǒng)一處理為內(nèi)核支持的224色ppm格式:
pnmquant 224 logo.pnm > logo224.pnm pnmtoplainpnm logo224.pnm > logo_linuxXX_clut224.ppm
XX 需替換為 00-24(對(duì)應(yīng) 25 幀動(dòng)畫(huà),如 logo_linux00_clut224.ppm、logo_linux01_clut224.ppm)。
二、文件部署:拷貝至內(nèi)核指定目錄
將轉(zhuǎn)換后的 25 張logo_linuxXX_clut224.ppm圖片,拷貝到內(nèi)核源碼的 logo 驅(qū)動(dòng)目錄:
OK3568-linux-source/kernel/drivers/video/logo/
三、配置修改:核心文件編輯
(一)修改 Makefile(編譯規(guī)則添加)
編輯 Makefile,添加新增圖片的編譯規(guī)則,確保 25 幀圖片被內(nèi)核編譯:
OK3568-linux-source/kernel/drivers/video/logo/Makefile
(二)修改 logo.c(幀切換邏輯)
編輯 logo.c,修正語(yǔ)法錯(cuò)誤并添加幀序列匹配邏輯:
OK3568-linux-source/kernel/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(結(jié)構(gòu)體聲明)
編輯 linux_logo.h,修正語(yǔ)法錯(cuò)誤并聲明 25 幀圖片結(jié)構(gòu)體:
OK3568-linux-source/kernel/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(內(nèi)核配置啟用)
編輯 defconfig,啟用 Logo 功能(刪除冗余聲音配置):
OK3568-linux-source/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
| 配置項(xiàng) | 說(shuō)明 |
|---|---|
| CONFIG_FRAMEBUFFER_CONSOLE=y | 啟用幀緩沖控制臺(tái) |
| 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(動(dòng)畫(huà)播放邏輯)
編輯 fbcon.c,添加幀循環(huán)播放和延時(shí)邏輯:
OK3568-linux-source/kernel/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++) { // 循環(huán)播放 25 幀 + fb_get_logo(info, i); + fb_show_logo(info, ops->rotate);
+ msleep(50); // 每幀延時(shí) 50ms,可調(diào)整動(dòng)畫(huà)速度
+ }
+#endif
update_region(vc,
vc->vc_origin + vc->vc_size_row * vc->vc_top,
vc->vc_size_row * (vc->vc_bottom - vc->vc_top));
可通過(guò)修改msleep(50)的值來(lái)調(diào)整動(dòng)畫(huà)播放速度,數(shù)值越小動(dòng)畫(huà)越快,建議范圍 30-100ms。
(六)修改 fbmem.c(Logo 位置與函數(shù)導(dǎo)出)
編輯 fbmem.c,修正 Logo 顯示位置并導(dǎo)出 fb_get_logo 函數(shù):
OK3568-linux-source/kernel/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(隱藏光標(biāo))
編輯 bitblit.c,禁用光標(biāo)顯示避免影響動(dòng)畫(huà)效果:
OK3568-linux-source/kernel/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) // 禁用軟光標(biāo)
+ if (0)
soft_cursor(info, &cursor);
ops->cursor_reset = 0;
四、編譯驗(yàn)證
完成所有修改后,執(zhí)行內(nèi)核編譯命令,生成新的鏡像文件并燒錄到 RK3568 開(kāi)發(fā)板,啟動(dòng)開(kāi)發(fā)板即可看到居中播放的 Logo 動(dòng)畫(huà)(25 幀循環(huán),每幀延時(shí) 50ms)。
詳細(xì)編譯方法請(qǐng)參考飛凌嵌入式提供的《OK3568編譯手冊(cè)》。
咨詢立即獲得專屬報(bào)價(jià)
華北區(qū)負(fù)責(zé)人
華東區(qū)負(fù)責(zé)人
華南區(qū)負(fù)責(zé)人
中西區(qū)負(fù)責(zé)人
相關(guān)產(chǎn)品 >
-
FET3568-C核心板
RK3568性能強(qiáng)而穩(wěn) 國(guó)產(chǎn)芯|飛凌嵌入式RK3568系列核心板,采用瑞芯微國(guó)產(chǎn)高性能AI處理器RK3568設(shè)計(jì)生產(chǎn),RK3568兼具CPU、GPU、NPU、VPU于一身,RK3568 性能、性價(jià)比在同類產(chǎn)品中具有較高優(yōu)勢(shì),RK3568處理器是一款定位中高端的通用型SoC, 飛凌RK3568核心板主要面向工業(yè)互聯(lián)網(wǎng)、HMI、NVR存儲(chǔ)、車載中控、工業(yè)網(wǎng)關(guān)等領(lǐng)域。目前RK3568系列已經(jīng)批量穩(wěn)定出貨
了解詳情
-
OK3568-C開(kāi)發(fā)板
強(qiáng)而穩(wěn),國(guó)產(chǎn)芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開(kāi)發(fā)板基于國(guó)產(chǎn)工業(yè)級(jí)AI處理器RK3568四核64位Cortex-A55 處理器設(shè)計(jì)。RK3568作為國(guó)產(chǎn)化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達(dá)到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規(guī)格書(shū)_datasheet_數(shù)據(jù)手冊(cè)_原理圖等,
了解詳情


