news 2026/10/1 20:35:34

配电终端国产化:基于米尔-全志T113实现安全启动与OTA升级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
配电终端国产化:基于米尔-全志T113实现安全启动与OTA升级

前阵子帮一位做配电自动化集成的朋友梳理现场问题时,他刚从配电房回来,为了给十几台跑了快五年的配电终端升固件,蹲点了一整天。每台设备都得拎着笔记本、串口线进柜子,断电停机才能刷,结果有一台刷到一半碰上现场跳闸,设备直接卡死在半升级状态,最后返厂才救回来。这种场景在配电终端运维里太常见了。他把新项目的需求抛给我:核心板全面国产化,他看中了米尔-全志系列核心板,但用户侧提了两个硬性指标——设备必须支持安全启动,必须支持OTA远程升级。这两个需求单看都不难,真正落地时却牵出一堆细节:证书链怎么配、eFuse一次性烧录怎么规划、升级包签名怎么做、断电回滚怎么保证。这篇文章就把我们调试过程中跑通的完整方案、踩过的坑、以及背后的设计逻辑一起整理出来,供做电力终端、工业控制类产品的嵌入式工程师参考。

1. 配电终端的国产化选型:为什么落在米尔-全志核心板上

1.1 配电终端设备面对的现实约束

配电终端不是常规消费电子。馈线终端(FTU)、站所终端(DTU)、配变终端(TTU)可能挂在户外电杆、箱变、配电房各种环境里,夏天高温、冬天低温,雷电和浪涌冲击都是家常便饭。这些设备一旦投运,往往要连续工作5到10年不关机。现场没有人值守,运维人员也不可能频繁跑站。所以终端产品的设计逻辑从一开始就和手机、路由器完全不同:可靠性优先,功能做扎实,升级动作要谨慎再谨慎。

传统做法是在出厂前把固件烧好,全生命周期都不动。但近几年需求越来越现实——规约升级、功能迭代、安全漏洞修补,全都逼着厂商把"远程升级"能力补上。随便一个小功能改动,如果还要派人带着电脑去现场断电刷机,成本完全不可接受。于是OTA从"加分项"变成了"必选项",而安全启动则是OTA不可信的前提:没有安全启动的OTA,升级包被篡改或被攻击者恶意灌入,终端就成了被人遥控的木马。

1.2 安全启动与OTA在"安全分区、网络专用"体系中的位置

电力行业的安全防护讲究纵深防御,主站侧、网络侧、终端侧都有对应的边界要求。终端侧的安全启动,本质上解决的是"身份可信"和"代码可信"两个问题:设备通电后,芯片能确认自己启动的每一个阶段都是厂商签发的、未被篡改的;在OTA场景下,终端收到升级包后能确认包来源可信、内容完整,不会照着攻击者给的镜像把自己刷死。

我见过不少团队把安全启动当成一个"有没有"的开关,觉得勾个配置打开就行。实际上它是一个体系:启动链每一级都要校验,证书密钥全生命周期要管理,OTA流程要跟安全启动配合默契,否则可能出现——安全启动开了,升级包签名工具链没打通,OTA功能直接废掉的情况。所以方案设计必须把这两件事放在一起规划,先定整体架构,再分头实现。

1.3 米尔-全志核心板的选型逻辑

选型时我们对比了几条路线。第一是继续用进口主控,方案成熟、资料多,但供货和国产化率指标让人头疼。第二是自己拿全志或者瑞芯微的芯片画板子,灵活度高,但要做DDR、Flash、电源管理的设计和验证,周期至少多两个月,对于配电终端这种量级不算大的项目不划算。第三就是走核心板路线,也就是我们现在定下来的:直接选米尔基于全志T113-S3做的核心板。

方案路线周期风险点适合场景
进口主控单板短国产化率、远期供货存量产品延续
国产芯片自研底板长硬件验证、DDR调参、信号完整性问题单款大批量
国产核心板+自研底板中等依赖核心板厂商支持电力、工控等多品类扩展

全志T113-S3是双核Cortex-A7架构,带硬件浮点单元,主频可以跑到1.2GHz,内部集成DDR,外设接口覆盖了电力终端常用的百兆网口、CAN、串口、USB和显示接口。对一个配电终端来说,这类性能完全够用,而且芯片本身在工业级温宽、供货持续性方面有优势。米尔把核心板做成了邮票孔封装,DDR、Flash、电源管理都集成好了,我们只需要画底板,把对外接口、隔离电源、保护电路做出来就行。硬件工作量大幅下降,团队可以把精力放在安全启动和OTA这套真正决定产品竞争力的软件架构上。

2. 安全启动落地:把全志启动链变成可信链

2.1 先理清全志平台的启动链

做安全启动之前,必须先搞懂芯片是怎么把系统拉起来的。全志平台的启动流程大致是:芯片上电后,片内固化的一段启动代码(BROM)从选定启动介质(SD卡、eMMC、SPI NOR、NAND)的固定位置读取引导程序,这段引导程序通常叫SPL或者boot0,作用是把DDR初始化好;随后SPL把U-Boot加载进内存运行;U-Boot再负责加载Linux内核;内核挂载根文件系统完成启动。

整条链是环环相扣的。安全启动要做的,就是在每一环启动下一环之前,先对下一环的镜像做完整性校验和签名验证。BROM把SPL验完,SPL把U-Boot验完,U-Boot把内核验完,内核再去验根文件系统。这样从芯片内部固化的信任根出发,一级一级传递信任,才能确保整条启动链上没有任何一环被人动过手脚。

信任根一般存放在eFuse里。eFuse是一种一次性可编程存储,写进去的位就永久锁定了,后期无法修改。通常会把根公钥的哈希烧到eFuse里,BROM启动时用这颗固定的哈希去验证SPL镜像上附带的证书和签名。这里要特别注意一个特性:eFuse的写入是不可逆的,一旦烧进去,哪怕后来发现公钥配错了,也只能换芯片。所以量产阶段的密钥规划必须慎之又慎。

2.2 别把嵌入式安全启动和PC的Secure Boot混为一谈

很多同事第一次接触安全启动,习惯性去网上搜"安全启动证书",搜出来一堆Windows 11的证书更新、UEFI Secure Boot的数据库(DBX)更新的内容。2023年确实有一波PC领域的安全启动证书更新,微软更新了吊销列表,导致一批旧设备启动异常。我们当时差点被这个误导,拿PC的搞法去套全志平台。

实际上这是两条完全不同的技术路径。PC的Secure Boot由UEFI固件实现,证书由微软和OEM厂商体系管理,用的是公开的证书数据库,遇到大规模证书吊销事件会通过系统更新分发新DBX。而嵌入式平台的安全启动,证书链完全由设备厂商自己签发和管理,不存在"从某处下载官方证书"这种操作。你的根密钥自己生成,设备上的公钥自己烧录,签名自己完成。网上那些"2023版安全启动证书下载"的内容,对我们做配电终端的没有任何参考价值,反而容易把方向带偏。

2.3 证书链设计与eFuse烧录流程

我们在项目里采用的是两级证书结构:根证书和平台证书。操作流程分两条线,一条是证书签发线,一条是镜像签名线。

证书签发线的步骤是:先离线生成根私钥和根证书,根证书自签名,作为整条链的信任锚。然后生成平台私钥和平台证书,用根私钥给平台证书签名。平台证书是实际给镜像签名的密钥对。根私钥保存在离线机器上,最好加密存储并做备份;平台私钥可以放在构建服务器上,方便打包流程自动签名。

镜像签名线的步骤是:每次构建固件后,对SPL、U-Boot、内核分别用平台私钥做签名,并附带平台证书链。启动时BROM用eFuse里的根公钥哈希取出根公钥,验平台证书的签名,再用平台公钥验证镜像的签名。

eFuse烧录是整个过程中最需要谨慎的环节。一旦把根公钥哈希写进eFuse并熔断,芯片就只认这一套证书体系。我们当时分了三步走:

  1. 在开发板上先用一组测试密钥跑通整个安全启动流程,确认签名工具、镜像格式、boot配置全部正确。
  2. 把测试密钥换成正版量产密钥,在几只工程板上做完整验证,包括多次OTA升级测试和掉电测试。
  3. 确认万无一失后,才把量产密钥的烧录脚本交给生产部门,同时把根私钥放进离线保险环境,整个生命周期内不进入产线。

提示:全志平台的Secure Boot具体实现、工具链版本和镜像打包格式,不同芯片系列会有差异,做正式方案前建议以全志FAE提供的官方包和文档为准。我们当时拿到的是一个Secure Boot工具包,包含密钥生成脚本、签名工具和烧录工具,不同版本之间的命令行参数不完全一致。

2.4 开启安全启动后怎么验证真的"安全"

安全启动不是开完就完事,必须在产品上做正向和反向两组验证。正向验证:设备正常启动,所有日志阶段通过,能正常进入系统。反向验证:故意篡改某个镜像的任意一个字节,再烧录进设备,设备应当拒绝启动或者在对应阶段停止。

我们当时做了一组比较完整的反向测试:改SPL的一个字节,启动直接卡死;改U-Boot的启动logo数据,日志停在U-Boot校验阶段;改内核镜像,U-Boot报签名验证失败,回落到recovery流程。这些测试证实了每一级校验都真正工作了,而不是只在文档里画了张图。

另外还要关注性能开销。安全启动增加了RSA验签运算,虽然量级不大,但在SPL阶段CPU主频还没起来,验签会占用几十到几百毫秒不等的时间。对配电终端这种对启动时间不算苛刻的设备来说完全可接受。但对那些有"秒级启动"需求的产品,就得提前评估考不考虑加密引擎硬件加速、是否需要缓存签名结果等优化手段。

3. OTA方案设计:分区策略、升级包签名与自动回滚

3.1 配电终端的OTA约束和普通设备完全不同

手机OTA常见的做法是用户点一下升级,设备联网下载、校验、重启,整个过程网络质量有保证,电池基本不会断。配电终端没有这么好的环境。它挂在电力通信网络里,可能走的是无线专网、运营商4G、电力载波,甚至是一段质量不怎么样的光纤。现场没有用户,断电完全不可控——市电故障、检修拉闸都可能发生在升级过程中。

这就给OTA设计提出了三个硬约束。第一,升级包要有可靠的完整性校验和签名机制,任何网络中途损坏的包都不能被执行。第二,整个升级过程必须支持断电恢复——无论是写到一半断电,还是升级完成后重启失败,设备都必须能回到一个可用状态。第三,升级通道的流量可能很有限,升级包不能太臃肿,还要考虑断点续传、失败重试这些能力。

把这些约束落到架构上,就是三个核心设计:双分区机制、升级包签名校验、启动回滚机制。

3.2 分区表设计:双分区加recovery

我们规划的分区方案围绕"冗余"展开。核心分区包括:

  • boot分区:存放U-Boot及环境变量。
  • recovery分区:存放一个最小恢复系统,普通系统起不来时可以进入recovery接收升级包。
  • kernel_a / kernel_b:两个内核镜像分区,交替使用。
  • rootfs_a / rootfs_b:两个根文件系统分区,和内核一一对应。
  • misc分区:存放OTA升级状态标志、启动计数、回滚计数等信息。
  • userdata分区:存放系统运行数据、日志、升级包缓存。

比如在eMMC上,分区顺序可以是boot、misc、kernel_a、rootfs_a、kernel_b、rootfs_b、recovery、userdata。U-Boot里通过环境变量记录当前应该从A组还是B组启动,misc分区里面的标志位则告诉U-Boot这次的启动是正常启动、升级后首次启动还是回滚启动。

这种A/B双分区的好处是,升级不是"覆盖"而是"切换"。升级时把新镜像写入当前不用的那组分区,写坏了大不了标记这组无效,老的系统一直在原地没动过。写入完成后设置"升级完成待切换"标志,重启后U-Boot选择新系统。新系统如果启动失败,U-Boot根据启动计数和标志自动切回旧分区,设备恢复正常运行。整套逻辑下来,最坏的情况不过就是"升级失败,设备回到旧版本",而不会出现"设备变砖"。

3.3 升级包制作、签名校验与下发链路

升级包本身设计成一个自描述容器,里面包含版本信息、分区镜像、镜像哈希、签名数据。我们在项目里用的是自定义打包脚本生成的tar归档格式,结构大致是:

ota_package_v103.tar ├── manifest.json # 版本号、目标设备型号、镜像列表、各镜像SHA256 ├── boot.img # 内核镜像 ├── rootfs_a.img # 根文件系统镜像 └── signature.bin # 对manifest.json的签名

生产环境里,打包脚本在学校或CI构建机上完成镜像编译后,先计算每个镜像的SHA256写入manifest.json,然后用平台私钥对manifest做签名,生成signature.bin。终端收到的第一层校验就是验签:终端内置平台公钥,升级程序先用公钥校验signature.bin,确认manifest完整可信之后,再逐项核对每个镜像的SHA256是否与manifest一致。一旦任何一项不匹配,升级包直接丢弃并记录失败日志。

下发链路走的是终端原本和主站通信的上行通道。主站下发一个升级任务,终端按需分片下载、边下边校验,下载完成后通知主站进入升级流程。考虑到弱网环境,我们的下载程序实现了断点续传——按块记录已下载完成的数据索引,网络断开重连后从断点继续,不用整包重来。配电终端上这个能力非常重要,因为无线通道的稳定性真不敢恭维。

我们当时还做了升级包加密。安全启动解决的是"设备不接受篡改包",但配电终端经过的网络环境复杂,还要防止升级包被截获后逆向分析或者回放攻击。所以升级包在签名基础上又做了一层加密,对称密钥通过一次会话握手协商出来,每次下发不同。加密不增加太多开发量,但对安全等级要求高的电力项目是加分项。

3.4 自动回滚机制怎么做才可靠

自动回滚很容易做成"有,但不好使"的状态。我们第一版只做了启动计数——U-Boot里有个bootcount环境变量,每次启动加1,bootmgr检查是否超出阈值。实测中发现问题:如果新系统启动成功但运行半小时后才崩溃,单纯靠启动计数是管不了的,因为计数在早期就正常了。

后来改成应用层上报心跳的联动方案。新系统启动后,业务守护进程正常运行、主站链接建立、采样数据正常上送,这些条件都满足时,应用层才向misc分区写入"系统运行正常"标志,表示本次升级完全成功,此时才把升级状态清零。U-Boot侧的判断逻辑是:

  1. 读取misc分区升级标志,确认是否存在"升级待确认"状态。
  2. 如果存在,读取当前启动计数,计数加1后写回。
  3. 如果计数超过设定阈值(我们设为3次),判定新系统不可用,切换启动分区回旧版本,同时清除升级标志。
  4. 如果计数未超阈值,继续正常启动新系统。
  5. 新系统应用层确认正常后,清除升级标志和启动计数。

这套逻辑覆盖了三种失败场景:新系统在U-Boot阶段起不来、新系统内核崩溃反复重启、新系统起来了但业务不正常。配电终端里最担心的就是"升级成功了,但设备不上送数据了,现场又没人发现",有了应用层确认,这种问题也能自动回滚解决。

4. 实测踩坑:串口调试、FEL烧录救砖与硬件浮点那点事

4.1 全志平台串口调试的第一道坎

第一次接触全志平台,最容易踩的就是调试串口。V3s、T113这些芯片的调试串口默认是UART0,电平3.3V,波特率通常115200。看着简单,但我们在一块V3s的板子上折腾了半天没输出,最后发现是电平问题——USB转串口模块用了5V电平,和板子3.3V的TX/RX直接怼在一起,虽然没烧坏芯片,但信号完全不对。

全志平台串口调试还有几个常见坑:

现象可能原因处理方式
上电完全无输出启动介质为空或BROM未执行检查烧录、进入FEL模式用工具烧引导
只有乱码波特率不匹配、TX/RX接反对照芯片手册确认波特率和引脚定义
输出到U-Boot就停U-Boot配置的console串口和设备树不一致核对cmdline和设备树uart配置
只输出uboot信息,内核无日志设备树串口节点未使能配置pinctrl和uart节点,重新编译

设备树里要把对应的uart节点状态设为okay并配好引脚复用。我们板子上的调试口是UART0,在设备树里需要把pinctrl的uart0引脚组打开。如果选了别的串口做调试,还要在内核cmdline里通过console=ttyS0,115200之类的参数指过去,U-Boot也保持同样的console配置,两边不一致的典型症状就是U-Boot有日志、内核没日志。

4.2 FEL模式与刷机救砖:安全启动之后更要谨慎

全志芯片有个很实用的机制叫FEL模式——上电时芯片不进正常启动流程,而是通过USB和PC通信,可以用工具直接读写Flash和内存。开发阶段的救砖利器就是它。我们平时用的刷机方式有两种:一种是把启动卡(TF卡)做成可引导镜像,插卡上电自动烧录;另一种是进FEL模式,配合全志的烧录软件或者命令行方式直接烧写eMMC/NAND。

H2+、V3s、T113这些芯片玩过的人都见过"变砖再救活"的场景。之前遇到一次编译出来的SPL坏道,板子什么都不输出,就是靠FEL模式救回来的——按住板上的FEL键上电,USB连电脑,把正确镜像重新烧写一遍,几秒钟活过来。

但安全启动开启之后,救砖规则变了。eFuse里的信任根已经烧死,任何镜像必须带合法签名才可能启动。这时候就算进了FEL模式,把SPL分区重刷,刷进去的东西没有正确的平台私钥签名,芯片照样拒绝执行。所以必须有意识地把这个问题前置解决:

  • 维护一套完整的签名构建环境,任何发布给现场的镜像都要经过签名流程,从源头杜绝"手头镜像没有签名"的情况。
  • FEL模式只作为底层救砖通道,真正恢复要用带有效签名的完整量产镜像。
  • 密钥和签名工具要有专人管理制度。我们遇到过同事拿测试密钥签的镜像刷到量产板上,启动链验签失败,排查半天才意识到密钥环境搞混了。

现场救砖的"最后手段"我们也验证过:制作一张预烧了带签名镜像的应急SD卡,同时提供FEL模式下的烧写脚本。即便eMMC完全损坏,也可以从SD卡启动最小恢复系统,之后再通过OTA把正常系统刷回来。这个方案测试下来最稳,推荐有条件的项目都预置。

4.3 T113的硬件浮点:工具链选错,性能差距跨数量级

T113-S3是双核Cortex-A7,带硬件浮点单元(NEON和VFPv4)。这个特性对配电终端很重要,因为电力采样分析里大量用到傅里叶变换、滤波器、有效值计算这类浮点密集运算。但前提是编译器必须生成硬件浮点指令。

嵌入式Linux工具链一般分两种:arm-linux-gnueabihf(hard float,浮点参数用浮点寄存器传递,直接发浮点指令)和arm-linux-gnueabi(soft float,用普通寄存器传递,浮点运算由libgcc软件模拟)。用错了工具链,性能差异非常大。我们在测试平台上跑一个简单的浮点运算压力测试,硬浮点版本比软浮点快了将近一个数量级。对CPU密集的采样计算来说,这个差距直接决定设备能不能扛住实时处理需求。

这里给个明确的建议:编译应用和内核时,统一使用带hf后缀的工具链,同时在编译参数里显式指定浮点ABI。

# 工具链选择示例 export CROSS_COMPILE=arm-linux-gnueabihf- export CC="${CROSS_COMPILE}gcc" export CFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard" # 内核配置也需确认CONFIG_VFP和CONFIG_NEON已开启

检查当前系统用的是硬浮点还是软浮点,可以在目标板上执行命令查看:

# 查看连接器报告的浮点ABI arm-linux-gnueabihf-readelf -A /path/to/binary | grep Tag_ABI_VFP_args

输出Tag_ABI_VFP_args: VFP registers说明用的是硬浮点ABI,如果显示compatible就是软浮点。这块如果发现系统里有些库是软浮点编译的,应用之间互相调用时会出现未定义指令错误,排查起来很费劲。我们后来干脆把整个rootfs统一用同一套hf工具链从源码构建,避免混用。

4.4 一个签名时间戳引起的OTA失败排查全记录

最后分享一个印象最深的OTA排查案例。安全启动和OTA上线测试后,第一轮升级一切正常,隔了一周做第二轮升级时终端总是报告"校验失败",但升级包在产线复测又是好的。一开始怀疑网络传输损坏,重新下载了好几遍都一样,SHA256在终端上算出来的值也和包对不上。

我们顺着排查链路走了一遍:先看终端日志,确认报的是manifest验签失败还是镜像哈希不匹配。日志显示验签那一步就失败了,也就是说终端认为signature.bin和manifest.json对不上。接着我们把升级包拿回PC上验证签名,发现签名是好的,不由得满脑子问号。

后来看终端时间,发现问题出在签名时的时间戳字段。我们的签名工具在签名时给证书附加了一个有效期,终端校验签名时会校验"当前时间是否在证书有效期内"。终端因为长时间运行没有对时,系统时间停留在上一轮OTA之前的某个点,导致签名有效性判断失败。升级包本身没问题,是设备本地时间不在签名有效期窗口内。

这个问题的根子在构建服务器和终端之间对时间信任的假设上。我们做了两个改进:一是签名工具去掉对时间窗口的强制校验,仅依赖证书链信任关系,配电终端这种长时间离线设备不该被时间问题卡住升级;二是OTA升级流程强制增加一个对时步骤,终端在执行升级任务前先向主站同步时间,同步失败则拒绝升级并上报原因。

这个案例说明安全启动和OTA的联动调试,牵涉的环节比想象中多。不是把签名和分区做对就行,签名策略里的每个字段、终端运行环境的每个状态,都可能成为链路里最意想不到的那根断点。

国产化方案做下来,我最大的体会是这套东西真的要尽早验证。硬件选型定了就先把安全启动跑通,密钥体系在生产前定好,OTA的A/B架构和回滚逻辑提前做完整测试。别等到现场出了第一批货再想着补课,配电终端一挂出去就是好几年,真出问题的时候,手里能用的牌很少。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 20:33:28

树莓派5车间部署六大道阻塞与工业级解决方案

1. 项目概述:为什么树莓派5进车间不是“插卡开机”那么简单“树莓派5进车间,卡在六件事上”——这句话不是调侃,是我在去年下半年接手某汽车零部件产线边缘智能改造项目时,贴在工控柜门内侧的真实手写便签。当时团队信心满满&…

作者头像 李华
网站建设 2026/10/1 20:32:37

2026年注册香港公司找哪家代理机构靠谱?

1. 注册香港公司代理机构是什么?有什么用? 注册香港公司代理机构,是指依据香港《公司服务提供者条例》取得信托或公司服务提供者牌照(TCSP)的专业服务机构,可合法为境外及本地投资者代办香港公司设立、年审…

作者头像 李华
网站建设 2026/10/1 20:30:58

Vue3集成OnlyOffice实现安全可控的文档编辑与预览

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 20:30:02

WPF MVVM中Modbus TCP类库的工业级改造方案

1. 这个ModbusTCP类库改进,到底在解决什么真实痛点?你写过WPF上位机吗?尤其是那种要连PLC、读寄存器、做实时监控大屏的项目。我做过不下二十个工业现场项目,几乎每个都绕不开Modbus TCP——它不是最先进,但它是现场设…

作者头像 李华
网站建设 2026/10/1 20:29:17

AI推广公司选型指南:GEO时代如何构建AI获客增长引擎

随着大模型技术的普及,用户获取信息的方式正从“搜索引擎”向“生成式AI问答”迁移。对于企业而言,传统的SEO(搜索引擎优化)已不足以覆盖新的流量入口,GEO(Generative Engine Optimization,生成…

作者头像 李华