0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ElfBoard技术贴|如何在【RK3588】ELF 2开发板中实现自定义开机动画

ElfBoard ? 2025-07-25 09:37 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式Linux系统的启动过程中,默认的文本启动日志往往缺乏良好的用户体验。为了提升设备启动时的视觉效果,可以通过psplash工具实现图形化开机动画,支持静态logo或动态动画显示。

psplash是一个轻量级的启动屏幕程序,专为嵌入式Linux系统设计,具有以下核心特性:

轻量高效:专为嵌入式设备设计,资源占用极低。

图形化支持:支持静态图片或动态帧动画(通过快速切换连续图片实现)。

高度可定制:可配置启动图像、进度条样式、显示时间等参数。

跨平台兼容:支持多种嵌入式Linux发行版和硬件平台。

注:本次在ELF 2开发板上主要验证静态图片显示和动态logo动画功能,进度条功能暂未测试。

下面将详细介绍如何在ELF 2开发板Buildroot系统中配置psplash,实现自定义开机动画。

一、图片制作

1、创建工程文件夹

首先,我们需要在虚拟机中创建一个文件夹来保存相关工程文件。打开终端,执行以下命令:

elf@ubuntu:~$mkdir -p psplash_logo/mp4_logo/

接着,将源码中的logo.mp4视频拷贝到刚刚创建的mp4_logo文件夹中。

2、安装FFmpeg

为了后续处理MP4视频,需要安装FFmpeg,在终端中执行以下命令:

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、创建图片存储文件夹

创建一个名为part0的文件夹,用于存储后续生成的图片:

elf@ubuntu:~/psplash_logo/mp4_logo$mkdir part0

4、 提取视频帧为图片

使用FFmpeg将视频文件logo.mp4按每秒7帧(7fps)的速率提取为一系列连续的PNG图片,并保存到part0/目录下。执行以下命令:

elf@ubuntu:~/psplash_logo/mp4_logo$ffmpeg -i logo.mp4 -f image2 -r7part0/%04d.png

5、查看生成的图片

执行以下命令查看part0文件夹中的图片内容:

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

二、图片转换

1、检查图片分辨率

在将图片转换为.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,因此需要对图片进行分辨率转换。

2、创建相关文件夹

创建logo_h文件夹,并在其中分别创建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、创建分辨率转换脚本

在master文件夹中创建fix_1024x600.sh脚本,用于进行分辨率转换。执行以下命令创建脚本:

elf@ubuntu:~/psplash_logo/mp4_logo/logo_h$ cd master/ elf@ubuntu:~/psplash_logo/mp4_logo/logo_h/master$ vi fix_1024x600.sh

脚本内容如下:

#!/bin/bash

5、赋予脚本可执行权限

执行以下命令赋予脚本可执行权限:

elf@ubuntu:~/psplash_logo/logo_h/master$chmod +x fix_1024x600.sh

6、执行脚本

执行脚本进行分辨率转换:

elf@ubuntu:~/psplash_logo/logo_h/master$./fix_1024x600.sh

7、验证转换结果

执行完毕后,使用以下命令查看logo_1024x600文件夹下转换好的图片文件的分辨率:

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、创建生成.h文件的脚本

在h文件夹中新建make-image-header.sh脚本,用于将图片转换为.h文件。执行以下命令创建脚本:

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

脚本内容如下:

#!/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、赋予脚本可执行权限

执行以下命令赋予脚本可执行权限:

elf@ubuntu:~/psplash_logo/logo_h/h$chmod +x make-image-header.sh

10、执行脚本

执行脚本将图片转换为.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开发板上使用的交叉编译器。打开 Makefile文件,修改内容如下:

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、创建logo文件夹并拷贝.h文件

创建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、添加宏定义

添加宏定义,方便后续编写参数:

#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函数中添加代码

在main函数中添加如下内容,用于绘制图片:

/* 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表示图片数据。由于宽度、高度和像素格式都相同,因此使用相同的参数,仅修改IMG_RLE_PIXEL_DATA图片数据的参数。


7、编译源码

执行以下命令进行编译:

elf@ubuntu:~/psplash_logo$make

编译成功后,会在psplash_logo文件夹下生成psplash和psplash-write文件。将这两个文件通过U盘拷贝到ELF 2 开发板的/usr/bin/目录。

四、Linux系统配置

1、创建启动脚本

在ELF 2 开发板的/etc/init.d/目录下新建S50weston_psplash脚本:

root@elf2-buildroot:~# vi/etc/init.d/S50weston_psplash

2、编写脚本内容

脚本内容如下:

#!/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、赋予脚本可执行权限

执行以下命令赋予脚本可执行权限:

root@elf2-buildroot:~# chmod+x/etc/init.d/S50weston_psplash

4、注意事项

sleep 6这里要根据实际的播放时间进行配置。建议在动画播放到最后放一张黑色背景的图片,以防关机时看到最底层的动态logo图片。

五、验证效果

配置完成后,保存并重启开发板,即可看到自定义的开机动画。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    606

    浏览量

    28739
  • 开发板
    +关注

    关注

    25

    文章

    5725

    浏览量

    105589
  • 嵌入式开发板

    关注

    5

    文章

    93

    浏览量

    19207
  • RK3588
    +关注

    关注

    7

    文章

    428

    浏览量

    6009
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读 瑞芯微旗舰芯RK3588系列
    的头像 发表于 09-22 15:54 ?2w次阅读
    瑞芯微<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b><b class='flag-5'>RK3588</b> EVB和<b class='flag-5'>RK3588</b>S EVB解读

    RZ-G2L 技术|psplash自定义开机画面

    psplash自定义开机画面:以下方法基于瑞萨RZ/G2L系列HD-G2L-IOT开发板测试.
    的头像 发表于 08-28 16:04 ?977次阅读
    RZ-G<b class='flag-5'>2</b>L <b class='flag-5'>技术</b><b class='flag-5'>贴</b>|psplash<b class='flag-5'>自定义</b><b class='flag-5'>开机</b>画面

    Banana Pi开源社区基于瑞芯微RK3588开发板,DeepSeek开发利器

    Banana Pi开源社区基于瑞芯微RK3588开发板,DeepSeek开发利器
    的头像 发表于 02-19 18:25 ?1998次阅读
    Banana Pi开源社区基于瑞芯微<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>,DeepSeek<b class='flag-5'>开发</b>利器

    ElfBoard技术|如何在RK3588ELF 2开发板上进行根系统的定制

    ELF 2开发板已经适配了Linux 5.10及Elf2 Desktop 22.04操作系统,其中Elf2 Desktop 22.04系统是
    的头像 发表于 07-02 16:33 ?2335次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如<b class='flag-5'>何在</b>【<b class='flag-5'>RK3588</b>】<b class='flag-5'>ELF</b> <b class='flag-5'>2</b><b class='flag-5'>开发板</b>上进行根系统的定制

    RK3588 EVB开发板原理图讲解【七】

    流程? Power Key 开机流程? 关机方式1. RK3588 实际开机电路描述2. 长按强制关机和复位的区别探讨
    发表于 02-28 08:51

    迅为3399开发板Android7/Android8修改开机动画

    配套资料在网盘资料的“iTOP-3399 开发资料汇总(不含光盘内容)\07_iTOP-3399 开发板修改开机动画资料”目录下。android7 和 android8 修改开机动画
    发表于 06-01 10:36

    瑞芯微旗舰芯RK3588开发板开售 比亚迪为应达利颁奖

    瑞芯微旗舰芯RK3588开发板发售 比亚迪为应达利颁奖 瑞芯微旗舰芯RK3588开发板发售 近日,瑞芯微旗舰芯RK3588系列
    的头像 发表于 03-25 19:23 ?5072次阅读

    【首发开箱】揭开RK3588开发板的神秘面纱!

    教你玩转RK3588开发板硬声入驻企业:瑞芯微教程包含以下内容:1、开箱:EVB开箱接线2、外部接口:EVB硬件接口介绍。3、环境搭建:EVB使用及调试方法。4、系统升级:RK3588
    的头像 发表于 03-14 11:24 ?3966次阅读
    【首发开箱】揭开<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>的神秘面纱!

    迅为RK3588开发板-基于瑞芯微RK3588摄像头方案

    RK3588开发板
    的头像 发表于 06-09 11:09 ?5513次阅读
    迅为<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>-基于瑞芯微<b class='flag-5'>RK3588</b>摄像头方案

    rk3588有哪些开发板

    rk3588有哪些开发板 当前,rk3588开发板有RockPro64、Rock960 Plus、Rockchip Sapphire、Khadas VIM3 Pro和Firefly
    的头像 发表于 08-15 17:04 ?3086次阅读

    RK3588!黑神话悟空,启动?-迅为电子RK3588开发板

    RK3588!黑神话悟空,启动?-迅为电子RK3588开发板
    的头像 发表于 08-30 14:13 ?1424次阅读
    <b class='flag-5'>RK3588</b>!黑神话悟空,启动?-迅为电子<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>

    迅为RK3588开发板Android12动态替换开机logo

    迅为RK3588开发板Android12动态替换开机logo
    的头像 发表于 11-15 15:04 ?1114次阅读
    迅为<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>Android12动态替换<b class='flag-5'>开机</b>logo

    玩转RK3588开发板基于connector-split 功能实现多屏联动

    玩转RK3588开发板基于connector-split 功能实现多屏联动
    的头像 发表于 12-02 16:05 ?1024次阅读
    玩转<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>基于connector-split 功能<b class='flag-5'>实现</b>多屏联动

    技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案

    技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案
    的头像 发表于 04-18 15:19 ?574次阅读
    <b class='flag-5'>技术</b>分享|iTOP-<b class='flag-5'>RK3588</b><b class='flag-5'>开发板</b>Ubuntu20系统旋转屏幕方案

    ElfBoard技术|【RK3588ELF 2开发板开机自启动详解

    在嵌入式系统开发,合理管理开机自启动项目能够优化系统启动流程,确保关键服务和应用按时加载运行。本文将详细介绍在ELF2开发板Linux5.
    的头像 发表于 06-27 16:20 ?1223次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|【<b class='flag-5'>RK3588</b>】<b class='flag-5'>ELF</b> <b class='flag-5'>2</b><b class='flag-5'>开发板</b><b class='flag-5'>开机</b>自启动详解