谷动谷力

 找回密码
 立即注册
查看: 1424|回复: 0
收起左侧

嵌入式本地和远程升级程序的方法

[复制链接]
发表于 2022-8-25 23:04:07 | 显示全部楼层 |阅读模式
嵌入式本地和远程升级程序的方法
8 i$ n: m: n$ p/ b# A$ o

嵌入式Linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。

本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。

这里介绍一种同时至此本地和远程升级的方法,以供参考。

本地升级
+ t1 M$ M9 ^" \# d$ [
+ b9 W6 [2 {: V9 \7 y8 d" v
(1)升级工具升级

现在的升级工具有很多,不同的芯片支持不同的工具,比如jlink,串口等,海思的芯片提供Hitool升级工具。升级工具升级直接参考芯片手册就可以了,这里不再介绍。

(2)存储设备升级

常见的存储设备有SD卡,TF卡,U盘,硬盘等。将升级文件拷贝到存储设备中,设备启动的时候,通过uboot去检索存储设备中是否有升级文件,如果有,则直接进行升级。

远程升级:
2 o2 Y: v! g. g4 x9 t- l/ h0 K5 u

& Y) D" `0 j0 g5 {: z# F
(1)uboot通过FTP服务下载升级文件升级

其实该方法可以说是本地升级也可以说是网络升级,uboot启动之后,设置uboot的网络参数和FTP服务,通过网络将升级文件下载到内存中,然后再通过uboot的flash擦除了写入指令,将升级文件直接写入到flash的指定位置上。

这种方式用来进行设备调试就可以,方便快捷,但它不能批量操作,也不能程序自动升级,需要人为的辅助。

(2)通过应用程序网络升级

该方法是嵌入式linux设备远程升级的最常用的方式。基本流程是:linux系统启动之后,通过应用程序从服务器中下载升级文件进行程序升级。该方法不需要认为操作,可设计程序自动全部升级。

本地和远程同时升级
* a& O% Z5 e! U9 t( T8 E

$ Z1 _/ n* s5 M$ V6 t

下面介绍一种可以同时至此本地升级和远程升级的方法,首先看下图:

640?wx_fmt=jpeg.jpg Flash数据分布示意图

假设有个64M的flash,间Flash分成uboot,kernel,roootfs,app,para 五个分区。然后我们在参数区para分区的开始一段空间用来存储升级文件的版本信息。

参数区的深蓝色区域用来存储软件的版本信息,橙色区域用来存储网络升级参数。下面以kernel升级为例,具体说明本地升级与网络升级的流程,其它模块升级于此相同。

(1)制作升级文件

编译器或是交叉编译工具编译生成的文件多数是二进制文件,也就是单纯的一个升级文件,不包含其他信息。携带更多的升级信息,我们可以将二进制升级文件.bin 打包成img 文件。

在Linux系统中可以直接使用mkimage命令,该命令可以指定CPU类型,img类型,压缩类型,内核的入口地址,头结构的名字,image的载入地址等等信息。

(2)本地升级实现

将img文件拷贝到U盘中插入设备。uboot需要为升级做如下操作:uboot起来之后,去扫描是否有插入存储设备,如果有存储设备,则扫描存储设备中是否有升级文件,以升级kernel为例,假设升级文件名为update_kernl.img。

当uboot检测到update_kernel.img文件后,去解析该img文件的文件头。将有用信息提取出来,比如文件头里的时间,img的创建时间等。

以这些作为升级参数,与上面flash图参数区中的Kernel Para版本做比较,如果一样则不进行升级操作,如果不一样,则将img文件中的升级文件数据写入到flash的指定位置中去。

最后更新Flash参数区kernel的版本信息。也就是上面图中参数区深蓝色中的Kernel Para。到此就完成了本地升级的操作。

(3)远程升级实现

首先将升级文件update_kernel.img从服务器中下载下来,与本地升级类似,提取update_kernel.img的头文件信息与Kernel Para参数做比较,如果不一样就升级。

一般升级地址是存在uboot的参数里,所以我们可以先将升级文件放到内存中(Hi3520芯片有一部分内存是用来做编解码的,软重启内存的数据不会被清空),uboot重启之后再进行升级操作。

在重启之前,将升级文件存放的地址AddrPhy,升级文件的校验信息DataCrc32,版本信息Version存放到flash的参数区去。

也就是上图参数区的橙色位置。uboot重启之后,去读取上图中flash参数区的橙色区域信息,看是否有需要升级的文件,如果有就按照升级参数的地址去读取升级文件,然后再将升级文件写到flash的固定位置去,最后更新参数区的升级信息。这样就完成了远程的升级操作。

上面介绍的升级方法,只介绍了基本的思路,详细实现内容太多不再介绍。如有更好的方法,欢迎评论指导。

; X' }+ f5 u7 t$ j# Q
$ q0 s+ z! T/ j, r* q
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-3-28 17:46 , Processed in 0.087674 second(s), 37 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表