尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

IronOS 启动 Logo 与开机动画实战指南:Flash 存储原理、文件格式与多设备烧录方法

发布时间:2026/9/25 3:10:15

资讯中心
01
ARTICLE

IronOS 启动 Logo 与开机动画实战指南:Flash 存储原理、文件格式与多设备烧录方法

IronOS 启动 Logo 与开机动画实战指南:Flash 存储原理、文件格式与多设备烧录方法
嵌入式固件硬件开发智能硬件【免费下载链接】IronOSOpen Source Soldering Iron firmware项目地址https://gitcode.com/gh_mirrors/ir/IronOS点击查看免费下载IronOS 为每台电烙铁提供了开机 Logo 功能设备启动时可以选择显示一张静态图片或一段动画并可自行控制停留时间或直接跳过。这篇指南完整覆盖 Logo 的 Flash 存储机制、预处理文件格式的逐字节解析、使用img2logo.py生成各型号 Logo 文件的方法以及 TS100/TS101/TS80/TS80P/S60/MHP30/Pinecil V1/V2 等设备的四种烧录途径。读完本文你可以为自己的设备定制专属开机画面并理解 IronOS 是如何让 Logo 在固件升级中幸存下来的。Logo 存储在哪里利用 Flash 尾部区域Bootup logo 存储在设备内部 Flash 的末尾区域紧邻用户设置user settings存放的位置。这个位置选择有明确的工程考量固件升级不会擦除它。正常的固件更新流程只覆盖固件应用所在的 Flash 区域末尾的 Logo 页不受影响。因此一旦写入 Logo它应当一直保留——除非主固件本身需要调整这块区域的布局擦除 Logo 有两种方式IronOS-Meta 仓库会为各型号生成专门的擦除文件内容等价于把 Logo 页恢复为空白状态如果你的烧录工具支持全片擦除full erase flash同样可以清掉 Logo。各板级支持包BSP通过FLASH_LOGOADDR宏定义 Logo 页的起始地址从各configuration.h中可以看到每个型号的实际布局均以 1KB 为一页Logo 占一页设备宏定义位置Flash 中的 Logo 地址MiniwareTS100/TS80/TS80Psource/Core/BSP/Miniware/configuration.h0x08000000 62 * 1024Miniware TS101source/Core/BSP/Miniware/configuration.h0x08000000 99 * 1024见下文特殊说明Pinecil V1source/Core/BSP/Pinecil/configuration.h0x08000000 126 * 1024Sequre S60source/Core/BSP/Sequre/configuration.h0x08000000 126 * 1024另一分支为 62KMHP30source/Core/BSP/MHP30/configuration.h0x08000000 126 * 1024Pinecil V2source/Core/BSP/Pinecilv2/configuration.h外部 SPI Flash0x23000000 1016 * FLASH_PAGE_SIZE由于 Logo 位于固定地址烧录 Logo 和烧录固件用的是同一套机制——这也是后面按设备区分-m参数的原因。显示入口GUIThread 启动时调用从源码结构看开机流程在 GUI 线程初始化时触发 Logo 显示source/Core/Threads/GUIThread.cpp 调用showBootLogo()各 BSP 则实现它把 Flash 中的 Logo 页喂给统一的BootLogo处理类。例如 MHP30 的实现其他 STM32 型号同理见 source/Core/BSP/MHP30/BSP.cppvoid showBootLogo(void) { BootLogo::handleShowingLogo((uint8_t *)FLASH_LOGOADDR); }Pinecil V2 由于 Flash 挂在 SPI 总线上不能直接内存映射它的实现会先把 1024 字节读到栈上缓冲区再处理见 source/Core/BSP/Pinecilv2/BSP.cppvoid showBootLogo(void) { alignas(uint32_t) uint8_t scratch[1024]; flash_read(FLASH_LOGOADDR - 0x23000000, scratch, 1024); BootLogo::handleShowingLogo(scratch); }Logo 文件格式解析1KB 页内的两种编码IronOS 使用一种预处理文件格式来大幅压缩图像占用的空间使得 1KB 单页 Flash 里不仅能装下静态 Logo还能容纳多帧动画。source/Core/Drivers/BootLogo.h 和 source/Core/Drivers/BootLogo.cpp 完整定义了运行时解码逻辑格式判别读取页头字节handleShowingLogo()读取 Logo 页头部来判别格式BootLogo.cpp若前 4 字节等于0xF00DAA55OLD_LOGO_HEADER_VALUE——旧格式紧随其后的 4 字节之后是纯 1-bit 位图数据96×16 像素若首字节为0xAA——新格式支持动画且修复了旧格式的字节交换问题后面紧跟帧间延迟字节和帧数据。新格式的帧编码新格式中Logo 页共 1024 字节第 1 字节是类型标记0xAA第 2 字节是帧间延迟单位 40ms运行于osDelay(interFrameDelay * 4)随后是变长的帧序列。每个帧由一个长度字节开头showNewFrame()长度字节含义后续数据0x00序列结束无0xFE清屏帧无只消耗 1 字节0xFF整帧刷新12 字节 × 8 96 字节的 1-bit 位图96×16 区域其他值n打补丁帧n/2个(index, value)对每个 2 字节index是 8 像素高的竖条列号0–111 覆盖 96×16 两半value是这 8 个像素的 1-bit 列数据补丁帧正是省空间的来源动画相邻帧只需描述变化的列而不是每帧都传 96 字节全图。整页容量为1024 − 1类型字节− 1延迟字节 1022字节与源码中position 1022的边界判断一致。LOGOTime 设置项控制显示行为设置项LOGOTime编号 35决定 Logo 显示时长取值语义由 source/Core/Inc/Settings.h 中的logoMode_t定义typedef enum { SKIP 0, // 跳过开机 Logo ONETIME 5, // 播放一次动画则只播一遍然后阻塞等待按键 INFINITY 6, // 动画循环播放直到按键 } logoMode_t;其余普通数值表示以秒为单位的超时时间。运行逻辑在 BootLogo.cpp 中ONETIME及以上会waitForButtonPress()无限等待按键普通秒数则waitForButtonPressOrTimeout(TICKS_SECOND * LOGOTime)等待按键或超时。该设置项在设置菜单中同样可调显示逻辑见 source/Core/Src/settingsGUI.cpp。生成 Logo 文件img2logo.py 转换流程因为 Logo 存放在设备内部 Flash 的固定位置可以使用与正常固件完全相同的烧录方式写入 Logo。但前提是把图片/动画转换成 IronOS 能理解的预处理格式。转换脚本img2logo.py位于 IronOS-Meta 仓库本仓库的上层元仓库含各固件与工具的Boot Logos文件夹中。社区贡献的现成 Logo 也以预转换形式随 IronOS-Meta 的 releases 发布下载对应型号的 zip 后按下面烧录一节直接刷入即可想用自己的图则必须走 Python 脚本转换。依赖与准备转换脚本至少需要 Python3、Pillow 和 IntelHex 三个库python -m pip install pillow python -m pip install intelhexPillow 也可以改用系统包管理器安装Debian 及类似发行版。在 Windows 上建议用 PowerShell 而不是旧版命令提示符运行脚本。图片本身可以是任意颜色、任意尺寸——脚本会将其缩放并转为 1-bit 黑白。但阈值化color-to-BW的效果并不总是理想最佳实践是直接在图像编辑器里手工创建 96×16 像素的png或bmp黑白图这也是显示区域的原生分辨率在 128×32 屏上 Logo 居中绘制于(16, 8)起点见 BootLogo.cpp。转换前把图片文件复制进脚本所在文件夹命令会短很多且脚本要求图片与img2logo.py、output_dfu.py、output_hex.py在同一目录。执行转换-m 型号参数基本命令python img2logo.py input.png out -m ${model}将把input.png转换后在out目录中生成输出文件。-m必须替换为以下型号之一——不同型号对应不同的 Flash 存储地址各设备生成的文件不可互换多设备用户需要为每个型号分别生成-m取值适用设备miniware老款 Miniware 烙铁TS100、TS80、TS80Ppinecilv1Pinecil V1pinecilv2Pinecil V2ts101Miniware TS101需额外步骤见下文s60Sequre S60mhp30Miniware MHP30处理完成后会得到一对.hex和.dfu文件实际用哪个取决于设备下文按设备说明。两点注意事项与原文档脚注一致TS101 和 S60 的屏幕分辨率高于 Logo 系统当时支持的 96×16后续版本约 2.23计划修复此问题TS101 需要额外的合并步骤见下一节。TS101 的特殊性Flash 限制与固件合并写入Miniware 在 TS101 上为降低成本使用了一颗带怪癖的 STM32 兼容 MCU并重写了 USB 引导加载器带来两个问题无法写入 99K 以上区域虽然 MCU 有 128K Flash但其 bootloader 写入超过约 99K 的内容会失败现象类似看门狗复位或硬崩溃。而旧版 bootloader 重复内容填充小文件的技巧也不再奏效小 hex 文件会被直接拒绝bootloader 占用变大100K 可用空间里有 32K 被 bootloader 吃掉旧 bootloader 只要 16K。主应用因此被限制在约 67K100K − 32K bootloader − 1K logo。后果是设置仍可以放在 Flash 上端约 28K 处但那块区域无法用于 USB 烧录Logo 不再放在 Flash 末尾而是放在最后一个可写页99K。source/Core/BSP/Miniware/configuration.h 中的注释与宏正是这一结论的固化#ifdef MODEL_TS101 // ... It cant appear to flash to some of the upper pages of flash, // So logo has to be located on page 99 or else it cant be flashed on stock bootloader #define FLASH_LOGOADDR (0x08000000 (99 * 1024)) #define SETTINGS_START_PAGE (0x08000000 (127 * 1024))为了让一次 USB 大写入就能完成TS101 的 Logo 与固件合并后一次性刷写后续升级无需再合并因为正常固件不会碰那块区域。生成 TS101 Logo 文件的完整命令为python3 img2logo.py image file path output folder path -m ts101 --merge Path to main firmware--merge参数会把 Logo 数据并入指定路径的主固件文件。正因如此IronOS-Meta 仓库不为 TS101 单独生成 Logo 文件——它永远需要与你的固件合并后使用。Pinecil V2 的前提条件Pinecil V2 的 Logo 支持是随 V2.22 版本加入的版本演进可查 Documentation/History.md 的 PinecilV2 章节。如果设备运行的是更早固件长按减号键可查看版本必须先升级到新版本再刷 Logo 文件。烧录 Logo四种途径虚拟磁盘上传TS100、TS101、TS80、TS80P、S60、MHP30如果你平时就是靠设备显示为 U 盘的方式更新固件用本方法。它适用于所有运行原装 DFU bootloader 的 Miniware 与 S60 设备让设备进入更新模式通常是在连接 PC 时按住 B 键像更新固件一样上传前面生成的.hex文件必要时采用你惯用的烧录技巧固件工作正常的话通常会在磁盘上生成一个.rdy文件作为确认拔掉设备再重新上电正常启动Logo 就会出现。GUI 烧录工具Pinecil V1/V2如果你平时用辅助图形工具刷固件这些工具对 bootlogo 文件的处理方式应与普通固件相同。先试.dfu文件再试.hex。如果两者都不行多半是该工具尚未更新到能处理 boot logo 的版本需要换用其他或更新版本的工具。dfu-util 命令行Pinecil V1 / IronOS-DFU 设备Pinecil V1 以及任何已转换为IronOS-DFUbootloader 的设备都可以用dfu-util命令行工具烧录按常规流程使用生成的.dfu文件刷入之后断电重启即可看到新 Logo。blispPinecil V2Pinecil V2 在不使用 GUI 工具时推荐使用blisp命令行工具。blisp已更新为同时支持.dfu文件和它历史上使用的.bin文件因此 Logo 直接用.dfu文件、按常规流程烧录即可工具会在结束时自动重启随即就能看到新 Logo。小结关键文件与路径速查显示与解码逻辑source/Core/Drivers/BootLogo.cpp、source/Core/Drivers/BootLogo.h各设备 Logo 页地址FLASH_LOGOADDR宏分别位于source/Core/BSP/*/configuration.h启动调用点source/Core/Threads/GUIThread.cpp显示时长设置LOGOTime与logoMode_t定义在 source/Core/Inc/Settings.h设置菜单中的 Logo 时长选项source/Core/Src/settingsGUI.cpp整套机制的设计要点在于以固定 1KB Flash 页承载经差分压缩的位图/动画借助与固件相同的烧录通道写入、又因位置隔离而免于被固件升级擦除各型号的差异TS101 的 99K 限制与固件合并、Pinecil V2 的 SPI Flash 与版本前提都通过 BSP 层的宏和工具链参数隔离在各自实现里。按本文的型号表选择-m参数生成文件再对应设备类型选一种烧录途径即可完成属于自己的开机画面定制。赞分享嵌入式固件硬件开发智能硬件【免费下载链接】IronOSOpen Source Soldering Iron firmware项目地址https://gitcode.com/gh_mirrors/ir/IronOS点击查看免费下载相关推荐Freqtrade 启动实战指南trade 命令、多配置文件与 user_data 目录机制Freqtrade 启动实战指南trade 命令、多配置文件与 user_data 目录机制 本文基于 freqtrade 官方文档 bot usage.md金融科技后端机器学习openvela块设备驱动存储设备管理与文件系统集成openvela块设备驱动存储设备管理与文件系统集成 概述 在现代嵌入式AIoT人工智能物联网系统中高效的存储设备管理是确保系统性能和可靠性的关键。op文档操作系统物联网嵌入式cytoscape.js 动画反向播放reverse() 方法原理与实战指南cytoscape.js 动画反向播放reverse 方法原理与实战指南 导读 reverse 是 cytoscape.js 动画对象 Animation数据可视化上一篇online-markdown vs 传统编辑器为什么开发者都选择这款微信排版工具下一篇163MusicLyrics从音乐元数据到精准歌词管理的系统性解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。