ST意法半导体
直播中

张娟

8年用户 2245经验值
私信 关注
[问答]

如何在stm32mp1上添加对动画启动画面的支持呢?

大家好,
如何在 STM32mp1 上添加对动画启动画面的支持?
我了解用于自定义引导屏幕的 psplash 配方,它工作得很好。我想在系统启动时播放动画。
任何输入都非常感谢。

回帖(1)

叶冬琳

2022-12-16 15:03:16
psplash 配方用于配置 Linux 内核动画启动画面!!!
在 U-Boot = 加载内核期间是否需要动画?
或者在 Linux 启动期间(直到用户空间准备就绪/应用程序正在运行)?
PSplash 是一个用户空间图形启动启动画面,主要用于支持 16bpp 或 32bpp 帧缓冲区的嵌入式 Linux 设备。它几乎没有依赖项(只有 libc),支持基本的图像和文本并处理旋转。它的视觉外观可以通过基本的源代码更改来配置。还包括一个“客户端”命令实用程序,用于向 psplash 发送信息,例如引导进度信息。
所以“psplash”配方链接到 Linux 内核中的引导屏幕/不链接到 U-Boot
对于 U-Boot 方面,我认为 U-Boot 中不存在通用功能“动画启动画面”
除了内核的 U-Boot 加载之外的任何平台都应该足够快以避免动画需要....
对于 Linux 部分,如果您使用我们的 Yocto 项目参考图像,这些图像使用 Linux 内核的闪屏功能,它只支持静止图像。
如果考虑动画,您需要将 pslash 支持更改为 plymouth
“psplash”和“plymouth”是通用的 Linux / Yocto 特性。
它们不喜欢 OpenSTLInux 或 STM32MP15,您应该找到它们的资源。
=> 今天仅支持固定徽标 (CONFIG_LCD_LOGO / CONFIG_VIDEO_LOGO)
     或显示存在于 extlinux.conf 中的背景 BMP 文件 (./cmd/pxe_utils.c:1442 = bmp_display)
     最后一个选项用于 OpenSTLinux / ST 板上,因为它对开发人员来说更容易
     和演示(U-Boot 启动画面/Linux psplash = boots 中使用了相同的文件)
元-st/meta-st-stm32mp/classes/extlinuxconf-stm32mp.bbclass
splashscreen_name = localdata.getVar('UBOOT_EXTLINUX_SPLASH')
但是由于 stm32mp15 的 U-Boot 提供了一个视频驱动程序,您可以实现任何板特定的功能来更新板上的附加屏幕。
动画可以在弱函数 show_boot_progress() 中处理,当 CONFIG_SHOW_BOOT_PROGRESS=y 时使用,因为它在 common/Kconfig.boot 中定义
=> 你需要直接处理帧缓冲区来创建动画(例如,进度条,
     您可以在代码中使用准备缓冲区并按原样使用 video_sync_copy() & video_sync()
     在 video_bmp_display 中完成)
今天,一些开发板使用这个弱函数 show_boot_progress() 来处理引导 LED 或打印
这个控制台上的启动信息......但我没有看到任何动态显示更新!
最简单的图形解决方案是激活视频控制台并显示进度
在环境为“stdout=serial,vidconsole”的屏幕上(uart 上的输出相同)
=> 您可以在 U-Boot 控制台中显示启动进度,
     例如在 board/st/stv0991/stv0991.c 中:
    #if CONFIG_IS_ENABLED(启动阶段)
    void show_boot_progress(int 进度)
   {
          printf("%in", 进度);
   }
   #万一
但它不是动画启动画面,只是控制台信息。
您也可以直接使用视频控制台 API(就像在 splash_display_banner 中所做的那样)
避免在 vidconsole 上复制 uart 控制台信息
=> 使用便宜的“进度条”,例如只为每个预期进度显示“#”字符
     通过使用 API:vidconsole_position_cursor() / vidconsole_put_string() / vidconsole_put_char()
警告:进度值不是 lineaire,最后一步是 BOOTSTAGE_ID_RUN_OS = 15 并且它不是最大的枚举 bootstage_id
或者在视频控制台上显示进度值:
  void show_boot_progress(int 进度)
  {
        字符缓冲区[3];
        结构udevice *开发;
        int col, row, ret;
        ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &dev);
        如果(退)
                返回;
         sprintf(buf, "%03in", 进度);
        vidconsole_position_cursor(dev, 10, 10);
        vidconsole_put_string(con, buf);
  }
警告:vidconsole 函数应仅在重新分配后/当视频控制台准备就绪时调用
                避免问题,应在此示例中添加一些保护。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分