软件升级之我见
对于嵌入式产品软件升级功能是必不可少的,如何确保软件升级的安全性、便捷性显得非常重要。笔者以机顶盒产品为例谈一谈对软件升级功能的体会。产品的软件要升级,首先需要获取升级的软件,而获取升级软件的途径目前主要有通过网络下载到该产品,或者通过USB存储器。在国内的机顶盒产品中,常见的是运营商把升级软件嵌入运营的有线网络中,由机顶盒检测升级标志位判断是否从有线网络中下载新软件,通过这种方式获取的软件安全性高、防攻击能力强;而销售到国外市场的机顶盒要升级软件,用户可以通过销售商获取新软件再通过USB升级软件,这种方式也算比较简便。对于有internet功能的机顶盒,获取新软件的最方便的方式莫过于通过因特网,全面进行后台操作,由用户决定是否使用新软件即可。接下来将重点介绍笔者作为主要设计人员开发的软件升级模块。
对于一个开放的机顶盒市场,机顶盒没有被运营商强行指定使用哪种产品,当然销售到该地区的机顶盒也不大可能把升级软件发到运营商网络中进行软件升级。笔者参与开发的产品定位海外,有internet功能,因此在软件升级模块(俗称loader)设计了通过因特网升级软件,以及通过USB进行软件升级。
软件升级的具体操作跟软件打包工具是息息相关的,也可以说是一个逆过程,因此要做好loader,首先得做好升级软件制作工具。在升级软件打包制作工具中,笔者嵌入了软件版本号、硬件版本号、工厂ID、设备ID、软件日期等信息,并对其做CRC校验,对于纯软件数据(如uboot、kernel、filesystem)根据flash类型及BLOCK大小来打包成小section,对该section做一次CRC,当所有纯软件数据打包完以后,再对前面section所有的CRC数据再做一次CRC,这样就可以确保升级软件数据的完整性、准确性。
首先来说一下通过USB升级软件的功能。用户获取了新软件存在U盘中,只要用户将此U盘插入机顶盒即可升级。在机顶盒软件的UBOOT中,开机检测有无USB设备,若有USB设备则检测特定名称的升级软件是否存在,如果存在则读入DDR中,对读入DDR中的软件版本号、硬件版本号、工厂ID、设备ID、软件日期等信息进行比较,计算CRC,确保软件数据的正确性、完整性,然后再写入flash中。
而通过internet升级软件的功能则要稍稍复杂一些,首先获取软件要做到对用户透明、后台操作。由于使用的flash为NAND FLASH,所以存储空间不需要考虑。在下载新软件的的时候,首先将通过加密手段确保机顶盒跟服务器之间建立一条安全通道,下载的数据可以支持断点续传。当全部数据通过后台下载完毕时,通知用户是否升级新软件,用户一旦确认则设置软件升级标志位。在机顶盒重启时,检测该标志位,如果需要升级软件,则在uboot中奖升级软件从文件系统中加载到DDR中,其他处理跟通过USB升级一样。这种升级方式涉及软件加密及网络断点续传等技术,以及uboot控制能力,要做好此功能,需要严格测试。
软件升级要考虑升级软件的便捷性、安全性、可靠性、可持续性。