1、背景介绍
嵌入式开发者交流中经常听到升级、烧录、刷机等词汇。升级一般特指产品售出后,通过产品自身的升级功能更新ROM系统软件。烧录的概念出现的最早,早期的PROM(一次性可编程ROM)的编程中,主要通过电压熔断器件内部的电路进行编程,所以形象地称之为烧录,后来逐渐沿用到现在的Flash、eMMC和UFS等ROM芯片。刷机是手机行业的术语,是指通过一定的方法更改或替换手机中原本存在的操作系统,通俗来讲,刷机就是给手机重装系统。在手机开发过程中烧录和刷机的概念已经逐渐模糊,日常交流中已经具有相近的含义。
2、刷机方式
现在工厂生产线的烧录分为两种,烧录器烧录和在线烧录。
- 烧录器烧录
烧录器烧录指的是在SMT制程之前,使用芯片烧录器将软件写入Flash、eMMC或UFS等芯片,下图中的手动烧录器,可以根据ROM芯片类型和接口版本的差异更换烧录座进行适配,一般用于工程验证或者小批量生产,产线为了生产效率一般使用自动烧录机,可以并行烧录更多的芯片。此类烧录方案直接通过芯片接口进行烧录,烧录速度快,且稳定性较高,但需要购置烧录器和烧录座,这些设备往往不便宜,成本较高,且针对不同类型的ROM芯片和烧录方案需要开发对应的驱动,比如NAND Flash的ECC规格不同,需要生成不同的OOB数据,另外还有坏块管理方式等因素,也会影响烧录方案的实现。
- 在线烧录
也称作板级烧录,在SMT制程将芯片焊接到PCB板后,通过上位机进行烧录的方式,一般使用USB、网线、UART等线材进行连接即可烧录。方案比较灵活,适用于软件迭代频繁的场景,在发现烧录错误后,不用拆卸芯片,又不需要烧录器等硬件设备,成本低廉,易于量产。当前手机生产测试流程相对复杂,通过流水线的设计也能速度能够达到生产需求,手机厂商的生产线目前大多采用在线烧录。
3、烧录程序
a.烧录流程
在线烧录一般方式是通过上位机发送一段烧录程序给嵌入式终端,烧录程序接收烧录镜像后写入:
上位机和终端之间使用的硬件接口协议决定了烧录速度,目前绝大部分手机使用USB2.0接口烧录,烧录速度一般都在<35MB/s。在了解烧录程序之前,首先需要了解一些和启动关联的常用概念:
BootRom:现在一般特指on-chip BootRom,记录了SOC上电后执行的第一段程序,芯片出厂后不可修改。
SPL:Secordary Program Loader,属于Bootloader一部分,主要功能是初始化DRAM,并把Bootloader搬移到DRAM执行。BootRom会将SPL加载到SRAM执行,SRAM空间有限,不能加载完整的Bootloader,因此有了BootRom>SPL>Bootloader的加载顺序。
Bootloader:系统引导程序,一般分为两段,第一段在SOC内的SRAM执行(即SPL),第二段在外部DRAM执行。
手机的在线刷机的过程大致为:
- SOC上电启动执行BootRom,检测ROM为空片,枚举USB端口,尝试接收数据。
- BootRom从USB接收烧录程序,加载到on chip SARM执行。
- 烧录程序从USB接收烧录镜像,并写入ROM。
所以大多数的SOC厂商都将烧录程序集成在Bootloader中,高通烧录程序firehose执行实现在SPL中,因为运行在内部SRAM,受SRAM大小限制,对于客制化二次开发不够友好,MTK烧录程序DA的烧录功能与u-boot类似,实现在Bootloader的第二阶段,在DDR中执行,下面从u-boot开源代码分析在线烧录的实现过程。
u-boot的链接脚本:
脚本最开始的两段MEMORY定义了SOC内部SRAM和外部DDR的地址和大小,SECTIONS段定义start.o的.text段放置在u-boot二进制程序的.text段最前面,因此start.S的_start是SPL程序的入口,执行关键节点:
_start():
设置异步异常寄存器vbar_elx,禁止IRQ、FIQ。
lowlevel_init():
为board_init_f()的执行进行特定的初始化,设置SP到SRAM。
board_init_f():
为borad_init_r()的执行进行初始化,包括时钟初始化、dram初始化、清除bss(dram)并拷贝uboot到dram。
board_init_r():
board_init_r()在外部dram中执行,进一步初始化ROM,建立dram动态内存池,进入指令执行loop,利用指令即可完成ROM芯片的烧录。
u-boot中为ROM芯片烧录提供了sf、mmc、ufs和scsi等指令,sf是SPI Flash(使用SPI接口的Flash)的烧录指令,mmc是eMMC的烧录指令,ufs和scsi是UFS的烧录指令:
由于烧录程序需要on-chip BootRom的引导,因此只有集成了BootRom的SOC才能支持在线烧录的方式。早期的SOC内部没有集成BootRom(早期某些SOC方案在调试时需要使用JTAG接口烧录),通常需要系统外部额外增加一个Nor Flash作为BootRom,后来随着NAND Flash、eMMC等大容量低成本的存储芯片和芯片安全的发展,额外集成一个Nor Flash(因为只有Nor Flash支持XIP,CPU不能直接从NAND Flash直接执行引导程序)造成硬件成本和软件开发成本的增加,SOC开始集成on-chip BootRom。
b.安全性
为了维护消费者和设备厂商的权益,防止系统软件被攻破篡改,对于SOC系统安全性提出了更高的要求,现在SOC的Vendor厂商一般都提供了整套的安全启动方案,烧录程序的安全实现与Bootloader程序一致,常见的实现方案有RSA数字签名和ECDSA签名,其中区别在于使用的加密算法不同,前者使用RSA算法加密,后者使用ECC算法签名,手机SOC的安全方案目前大多使用ECDSA签名,后者的算法速度更快,安全性更高。
烧录程序签名:
常见Hash算法:MD5、SHA-256
常见加密算法:RSA、ECC
烧录程序验证:
设备出厂前,SOC需要烧录efuse和根密钥。BootRom检测efuse配置后,使用根密钥验证公钥证书,然后使用公钥验证镜像签名,保证烧录程序的安全性。
c.完整性
烧录工序是产线生产中相对靠前的工序,为保证产线的生产效率,需要保证烧录到ROM中的镜像与预期一致,同时也可以防止烧录镜像被篡改,一般通过校验hash的方式保证刷机过程的完整性:
d.在线烧录常见问题
1)烧录程序不能正常加载运行
可以从软硬件两方面进行检查原因,使用Bus Hound或者Wireshark抓取USB数据:
a. 开启SecureBoot的SOC,不能加载未签名的烧录程序运行,从USB数据包看,是BootRom接收烧录程序后,返回一个协议包,提示签名问题。
b. 终端厂商客制化有时会客制化SPL程序,导致SPL程序的大小超过SOC分配给SPL程序内存大小,从USB数据包看,是BootRom接收烧录程序后,不再有任何数据包返回。
c. SOC、DDR等硬件问题也可能导致烧录程序启动失败,SOC芯片问题,通常抓取不到任何数据包,需要硬件工程师排查。DDR关联的硬件问题,一般是SPL程序加载之后,可以看到SPL程序的日志传输或者烧录程序的二段传输的USB数据包,此时可通过芯片厂商SPL提供的测试指令进行确认,节省硬件工程师分析问题的时间。
2)生产环境中刷机过程中概率性USB端口离线,刷机中断。
a. 更换USB数据线对比测试,量产过程中USB接口的频繁插拔,更易产生磨损,可能会造成USB的接触不良。
b. 产线和实验室因为效率的要求,上位机需要同时给多台终端,烧录镜像,部分上位机的USB控制器存在过流保护电路,多台设备同时产生了高电流,可能会触发过流保护电路,造成USB端口复位离线,在量产前需提前测试刷机过程中USB电流变化:
为了USB端口稳定,量产过程中可通过烧录程序需要关闭电池充电、通过外部治具给PCB板供电等手段达到降低USB电流的目的。
4、嵌入式ROM
嵌入式ROM从1956年工程师周文俊发明的第一片PROM,发展至UFS,容量也从最初的几KB发展至如今的几百GB。
在嵌入式产品方案中,如果ROM需要存储XIP程序,通常需要使用Nor Flash,反之仅仅选用Nand Flash即可。Nor Flash和Nand Flash都使用MOS(晶体场效应管)作为存储单,下图是Flash常用的FG MOSFET的横截面结构:
区别在于两者之前的整列结构,Nor Flash的存储单以并联方式连接在Bit line上,Nand Flash的存储单以串联方式连接在Bit line,所以CPU可以在Nor Flash进行随机访问取指,Nand Flash只能读取整个Page到RAM中,再由CPU取指译码。
eMMC和UFS都是由Nand Flash发展而来,封装了Nand Flash和Flash控制器。
eMMC封装使用MMC总线接口:
eMMC存储包含了3类数据区域:
Boot Area Parititon: 存储Bootloader程序,从User Data Area拆分而来,也可通过设置寄存器从User Data Area启动。
RPMB Partition:Replay Protected Memory Block,用于存储密码、指纹、IMEI等敏感信息,需要在产线烧录Authentication Key使能写入校验。
User Data Area:存储系统和用户数据。
UFS设备使用MIPI接口封装:
UFS设备支持以SCSI指令集管理和读写:
SCSI指令最终路由到Device Manager或者UFS Logical Unit处理,UFS内部划分了多个Logical Unit存储用户数据,每个LU相互独立,拥有独立的地址空间。
5、小结
在线刷机以低成本、易量产的优点受到手机厂商的青睐,烧录速度和稳定性是产线关注的因素。烧录速度的上限由烧录接口决定,烧录程序一般通过DMA方式接收数据、数据摘要校验算法优化等方式考虑烧录速度的优化。SMT贴片质量、生产治具、接口线材磨损和上位机环境等都会影响烧录的稳定性,当前在线刷机大多使用USB接口,PCB上电和烧录过程中造成的电流浪涌可能会影响上位机USB控制器的稳定,需要生产治具与烧录程序控制合理的供电方式,减少电流浪涌带来的稳定性问题。
因为成本和使用场景的原因目前大部分手机采用USB2.0接口,镜像的传输速度远低于ROM写入速度,可以考虑通过压缩减小传输镜像,手机侧解压后写入的方式缩短烧录时间。由于USB稳定性产生的烧录中断问题,可以考虑通过上位机检测烧录状态和烧录结果快速复位手机二次烧录,减少人工干预提升效率。
参考文献:
1.https://github.com/u-boot/u-boot
2.https://en.wikipedia.org/wiki/Flash_memory
3.https://www.jedec.org/standards-documents/docs/jesd220c-22
往
期
推
荐
长按关注内核工匠微信
Linux内核黑科技| 技术文章| 精选教程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/103371.html