在嵌入式Linux系統(tǒng)的啟動過程中,默認的文本啟動日志往往缺乏良好的用戶體驗。為了提升設(shè)備啟動時的視覺效果,可以通過psplash工具實現(xiàn)圖形化開機動畫,支持靜態(tài)logo或動態(tài)動畫顯示。
psplash是一個輕量級的啟動屏幕程序,專為嵌入式Linux系統(tǒng)設(shè)計,具有以下核心特性:
輕量高效:專為嵌入式設(shè)備設(shè)計,資源占用極低。
圖形化支持:支持靜態(tài)圖片或動態(tài)幀動畫(通過快速切換連續(xù)圖片實現(xiàn))。
高度可定制:可配置啟動圖像、進度條樣式、顯示時間等參數(shù)。
跨平臺兼容:支持多種嵌入式Linux發(fā)行版和硬件平臺。
注:本次在ELF 2開發(fā)板上主要驗證靜態(tài)圖片顯示和動態(tài)logo動畫功能,進度條功能暫未測試。
下面將詳細介紹如何在ELF 2開發(fā)板Buildroot系統(tǒng)中配置psplash,實現(xiàn)自定義開機動畫。
一、圖片制作
1、創(chuàng)建工程文件夾
首先,我們需要在虛擬機中創(chuàng)建一個文件夾來保存相關(guān)工程文件。打開終端,執(zhí)行以下命令:
elf@ubuntu:~$mkdir -p psplash_logo/mp4_logo/
接著,將源碼中的logo.mp4視頻拷貝到剛剛創(chuàng)建的mp4_logo文件夾中。
2、安裝FFmpeg
為了后續(xù)處理MP4視頻,需要安裝FFmpeg,在終端中執(zhí)行以下命令:
elf@ubuntu:~$ cd psplash_logo/mp4_logo/ elf@ubuntu:~/psplash_logo/mp4_logo$ sudo apt-get update elf@ubuntu:~/psplash_logo/mp4_logo$ sudo apt-get install ffmpeg
3、創(chuàng)建圖片存儲文件夾
創(chuàng)建一個名為part0的文件夾,用于存儲后續(xù)生成的圖片:
elf@ubuntu:~/psplash_logo/mp4_logo$mkdir part0
4、 提取視頻幀為圖片
使用FFmpeg將視頻文件logo.mp4按每秒7幀(7fps)的速率提取為一系列連續(xù)的PNG圖片,并保存到part0/目錄下。執(zhí)行以下命令:
elf@ubuntu:~/psplash_logo/mp4_logo$ffmpeg -i logo.mp4 -f image2 -r7part0/%04d.png
5、查看生成的圖片
執(zhí)行以下命令查看part0文件夾中的圖片內(nèi)容:
elf@ubuntu:~/psplash_logo/mp4_logo$ ls part0/ 0001.png 0004.png 0007.png 0010.png 0013.png 0016.png 0019.png 0022.png 0025.png 0028.png 0031.png 0034.png 0037.png 0040.png 0043.png 0046.png 0049.png 0052.png 0002.png 0005.png 0008.png 0011.png 0014.png 0017.png 0020.png 0023.png 0026.png 0029.png 0032.png 0035.png 0038.png 0041.png 0044.png 0047.png 0050.png 0053.png 0003.png 0006.png 0009.png 0012.png 0015.png 0018.png 0021.png 0024.png 0027.png 0030.png 0033.png 0036.png 0039.png 0042.png 0045.png 0048.png 0051.png 0054.png
二、圖片轉(zhuǎn)換
1、檢查圖片分辨率
在將圖片轉(zhuǎn)換為.h文件之前,需要確保圖片分辨率與屏幕分辨率一致。使用以下命令查看圖片分辨率:
elf@ubuntu:~/psplash_logo/mp4_logo$ file part0/0001.png part0/0001.png: PNG image data, 640 x 360, 8-bit/color RGB, non-interlaced
可以看到圖片分辨率是640x360,本次測試使用的是飛凌7寸MIPI屏,分辨率為1024x600,因此需要對圖片進行分辨率轉(zhuǎn)換。
2、創(chuàng)建相關(guān)文件夾
創(chuàng)建logo_h文件夾,并在其中分別創(chuàng)建h、logo_1024x600、master三個文件夾:
elf@ubuntu:~/psplash_logo/mp4_logo$ mkdir logo_h elf@ubuntu:~/psplash_logo/mp4_logo$ cd logo_h/ elf@ubuntu:~/psplash_logo/mp4_logo/logo_h$ mkdir h logo_1024x600 master
3、拷貝圖片到master文件夾
將part0文件夾下的所有PNG格式的圖片拷貝到master文件夾中備用:
elf@ubuntu:~/psplash_logo/logo_h$cp ../part0/* ./master/
4、創(chuàng)建分辨率轉(zhuǎn)換腳本
在master文件夾中創(chuàng)建fix_1024x600.sh腳本,用于進行分辨率轉(zhuǎn)換。執(zhí)行以下命令創(chuàng)建腳本:
elf@ubuntu:~/psplash_logo/mp4_logo/logo_h$ cd master/ elf@ubuntu:~/psplash_logo/mp4_logo/logo_h/master$ vi fix_1024x600.sh
腳本內(nèi)容如下:
#!/bin/bash
5、賦予腳本可執(zhí)行權(quán)限
執(zhí)行以下命令賦予腳本可執(zhí)行權(quán)限:
elf@ubuntu:~/psplash_logo/logo_h/master$chmod +x fix_1024x600.sh
6、執(zhí)行腳本
執(zhí)行腳本進行分辨率轉(zhuǎn)換:
elf@ubuntu:~/psplash_logo/logo_h/master$./fix_1024x600.sh
7、驗證轉(zhuǎn)換結(jié)果
執(zhí)行完畢后,使用以下命令查看logo_1024x600文件夾下轉(zhuǎn)換好的圖片文件的分辨率:
elf@ubuntu:~/psplash_logo/mp4_logo/logo_h/master$ file ../logo_1024x600/0001.png ../logo_1024x600/0001.png: PNG image data, 1024 x 600, 8-bit/color RGB, non-interlaced
8、創(chuàng)建生成.h文件的腳本
在h文件夾中新建make-image-header.sh腳本,用于將圖片轉(zhuǎn)換為.h文件。執(zhí)行以下命令創(chuàng)建腳本:
elf@ubuntu:~/psplash_logo/mp4_logo/logo_h/master$ cd ../h/ elf@ubuntu:~/psplash_logo/mp4_logo/logo_h/h$ vi make-image-header.sh
腳本內(nèi)容如下:
#!/bin/sh # 指定圖片目錄和名稱前綴 img_dir="$1" name_prefix="$2" # 檢查目錄是否存在 if [ ! -d "$img_dir" ]; then echo "目錄 $img_dir 不存在" exit 1 fi i=0 # 遍歷目錄中的所有 PNG 文件 for img in "$img_dir"/*.png; do # 檢查是否找到了 PNG 文件 if [ ! -e "$img" ]; then echo "沒有找到 PNG 文件" break fi imageh=`basename "$img" .png`-img.h # name="${name_prefix}_${imageh}" name="${name_prefix}_$(printf "%01d" "$i")_IMG" # 生成 C 頭文件 gdk-pixbuf-csource --macros "$img" > "$imageh.tmp" sed -e "s/MY_PIXBUF/${name}/g" -e "s/guint8/uint8/g" "$imageh.tmp" > "$imageh" && rm "$imageh.tmp" i=$(expr $i + 1) echo "生成了 $imageh" done
9、賦予腳本可執(zhí)行權(quán)限
執(zhí)行以下命令賦予腳本可執(zhí)行權(quán)限:
elf@ubuntu:~/psplash_logo/logo_h/h$chmod +x make-image-header.sh
10、執(zhí)行腳本
執(zhí)行腳本將圖片轉(zhuǎn)換為.h文件:
elf@ubuntu:~/psplash_logo/logo_h/h$ ./make-image-header.sh ../logo_1024x600 POKY 生成了 0001-img.h 生成了 0002-img.h 生成了 0003-img.h 生成了 0004-img.h 生成了 0005-img.h 生成了 0006-img.h 生成了 0007-img.h 生成了 0008-img.h 生成了 0009-img.h 生成了 0010-img.h 生成了 0011-img.h 生成了 0012-img.h ... ... ...
三、psplash源碼修改
1、拷貝并解壓psplash源碼
請自行將psplash源碼拷貝到psplash_logo/文件夾中并解壓。
elf@ubuntu:~/psplash_logo$ ls mp4_logo psplash.zip elf@ubuntu:~/psplash_logo$ unzip psplash.zip
2、修改Makefile文件
修改Makefile文件,將CC變量修改為ELF 2開發(fā)板上使用的交叉編譯器。打開 Makefile文件,修改內(nèi)容如下:
AUTOMAKE = ${SHELL} /home/wonhere/zhangqi/OMAP3530/psplash/missing --run automake-1.11 AWK = gawk #CC = arm-none-linux-gnueabi-gcc CC = /home/elf/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-linux-gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 CPP = arm-none-linux-gnueabi-gcc -E
3、創(chuàng)建logo文件夾并拷貝.h文件
創(chuàng)建logo文件夾,并將h文件夾中的*-img.h文件都拷貝到logo文件夾中:
elf@ubuntu:~/psplash_logo$ mkdir logo elf@ubuntu:~/psplash_logo$ cp mp4_logo/logo_h/h/* logo/
4、在psplash.c文件中添加引用
在psplash.c文件中添加對.h文件的引用:
#include "logo/0001-img.h" #include "logo/0002-img.h" #include "logo/0003-img.h" 。。。 。。。 。。。 #include "logo/0047-img.h" #include "logo/0048-img.h" #include "logo/0049-img.h" #include "logo/0050-img.h" #include "logo/0051-img.h" #include "logo/0052-img.h" #include "logo/0053-img.h" #include "logo/0054-img.h"
5、添加宏定義
添加宏定義,方便后續(xù)編寫參數(shù):
#define IMG_WIDTH(x) POKY_##x##_IMG_WIDTH #define IMG_HEIGHT(x) POKY_##x##_IMG_HEIGHT #define IMG_BYTES_PER_PIXEL(x) POKY_##x##_IMG_BYTES_PER_PIXEL #define IMG_RLE_PIXEL_DATA(x) POKY_##x##_IMG_RLE_PIXEL_DATA
6、在main函數(shù)中添加代碼
在main函數(shù)中添加如下內(nèi)容,用于繪制圖片:
/* Draw the Myir logo */ /* psplash_fb_draw_image (fb, (fb->width - POKY_IMG_WIDTH)/2, ((fb->height * 5) / 6 - POKY_IMG_HEIGHT)/2, POKY_IMG_WIDTH, POKY_IMG_HEIGHT, POKY_IMG_BYTES_PER_PIXEL, POKY_IMG_RLE_PIXEL_DATA); */ psplash_fb_draw_image (fb, (fb->width - IMG_WIDTH(0))/2, (fb->height - IMG_HEIGHT(0))/2,IMG_WIDTH(0),IMG_HEIGHT(0),IMG_BYTES_PER_PIXEL(0),IMG_RLE_PIXEL_DATA(0)); usleep(50000); 。。。 。。。 。。。 psplash_fb_draw_image (fb, (fb->width - IMG_WIDTH(0))/2, (fb->height - IMG_HEIGHT(0))/2,IMG_WIDTH(0),IMG_HEIGHT(0),IMG_BYTES_PER_PIXEL(0),IMG_RLE_PIXEL_DATA(50)); usleep(50000); psplash_fb_draw_image (fb, (fb->width - IMG_WIDTH(0))/2, (fb->height - IMG_HEIGHT(0))/2,IMG_WIDTH(0),IMG_HEIGHT(0),IMG_BYTES_PER_PIXEL(0),IMG_RLE_PIXEL_DATA(51)); usleep(50000); psplash_fb_draw_image (fb, (fb->width - IMG_WIDTH(0))/2, (fb->height - IMG_HEIGHT(0))/2,IMG_WIDTH(0),IMG_HEIGHT(0),IMG_BYTES_PER_PIXEL(0),IMG_RLE_PIXEL_DATA(52)); usleep(50000); psplash_fb_draw_image (fb, (fb->width - IMG_WIDTH(0))/2, (fb->height - IMG_HEIGHT(0))/2,IMG_WIDTH(0),IMG_HEIGHT(0),IMG_BYTES_PER_PIXEL(0),IMG_RLE_PIXEL_DATA(53)); usleep(50000);
這里的IMG_WIDTH表示寬度,IMG_HEIGHT表示高度,IMG_BYTES_PER_PIXEL表示像素格式,IMG_RLE_PIXEL_DATA表示圖片數(shù)據(jù)。由于寬度、高度和像素格式都相同,因此使用相同的參數(shù),僅修改IMG_RLE_PIXEL_DATA圖片數(shù)據(jù)的參數(shù)。
7、編譯源碼
執(zhí)行以下命令進行編譯:
elf@ubuntu:~/psplash_logo$make
編譯成功后,會在psplash_logo文件夾下生成psplash和psplash-write文件。將這兩個文件通過U盤拷貝到ELF 2 開發(fā)板的/usr/bin/目錄。
四、Linux系統(tǒng)配置
1、創(chuàng)建啟動腳本
在ELF 2 開發(fā)板的/etc/init.d/目錄下新建S50weston_psplash腳本:
root@elf2-buildroot:~# vi/etc/init.d/S50weston_psplash
2、編寫腳本內(nèi)容
腳本內(nèi)容如下:
#!/bin/sh ### BEGIN INIT INFO # Provides: psplash # Required-Start: # Required-Stop: # Default-Start: S # Default-Stop: ### END INIT INFO sleep 1 /etc/init.d/S49weston stop case "$1" in start) echo "Starting psplash..." export TMPDIR=/mnt/.psplash mkdir -p $TMPDIR mount tmpfs -t tmpfs $TMPDIR -o,size=2M rotation=0 if [ -e /etc/rotation ]; then read rotation < /etc/rotation fi /usr/bin/psplash --angle $rotation & ;; stop) echo "Stopping psplash..." killall psplash umount $TMPDIR rmdir $TMPDIR ;; *) echo "Usage: \$0 {start|stop}" exit 1 ;; esac sleep 6 pkill psplash /etc/init.d/S49weston start /etc/init.d/S50matrix-browser start exit 0
3、賦予腳本可執(zhí)行權(quán)限
執(zhí)行以下命令賦予腳本可執(zhí)行權(quán)限:
root@elf2-buildroot:~# chmod+x/etc/init.d/S50weston_psplash
4、注意事項
sleep 6這里要根據(jù)實際的播放時間進行配置。建議在動畫播放到最后放一張黑色背景的圖片,以防關(guān)機時看到最底層的動態(tài)logo圖片。
五、驗證效果
配置完成后,保存并重啟開發(fā)板,即可看到自定義的開機動畫。
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
608瀏覽量
29374 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5990瀏覽量
109940 -
嵌入式開發(fā)板
+關(guān)注
關(guān)注
5文章
99瀏覽量
19514 -
RK3588
+關(guān)注
關(guān)注
8文章
457瀏覽量
6736
發(fā)布評論請先 登錄
ElfBoard技術(shù)貼|如何在【RK3588】ELF 2開發(fā)板上進行根系統(tǒng)的定制

技術(shù)貼|【RK3588】ELF 2開發(fā)板如何添加exFAT和NTFS文件系統(tǒng)格式

RK3588 EVB開發(fā)板原理圖講解【七】
RK3588 EVB開發(fā)板原理圖講解【八】 RK3588 power Tree
迅為3399開發(fā)板Android7/Android8修改開機動畫
瑞芯微旗艦芯RK3588開發(fā)板開售 比亞迪為應(yīng)達利頒獎
rk3588有哪些開發(fā)板?
玩轉(zhuǎn)RK3588開發(fā)板基于connector-split 功能實現(xiàn)多屏聯(lián)動

技術(shù)分享|iTOP-RK3588開發(fā)板Ubuntu20系統(tǒng)旋轉(zhuǎn)屏幕方案

ElfBoard技術(shù)貼|【RK3588】ELF 2開發(fā)板開機自啟動詳解

評論