admin 管理员组

文章数量: 1184232


2024年4月12日发(作者:大连web前端培训)

《工业控制计算机}2012年第25卷第6期 

Li n ux智能手机上自动升级模块的设计与实现 

Design and Implementation of Auto-upgrade Module in Linux Smart Phone 

胡祝华 (海南大学应用科技学院,海南海口571101) 

赵瑶池 (海南大学信息科学技术学院,海南海口570228) 

胡诗雨 (上海交通大学安泰经济与管理学院,上海200052) 

摘 要 

为了在基于ARM内核的Linux智能手机上实现固件的自动升级功能,基于奔峰的DM规范提出了一套完整的实施方 

案。该方案对Flash进行了重新布局,重新规划了Bootloader的结构,实现了UA的自动跳转,同时对Flash的读、擦、写算 

法进行了优化实现。实验表明该方案具有较好的时效性,在bug修复、新功能的扩展方面具有较好的应用价值。 

关键词:ARM,固件,DM,自动升级 

Abstract 

In order to upgrade firmware automatically in the Linux Smart Phone based ARM Kernel,this paper presents a com— 

plete design scheme based BitFone S Standard about DM This scheme includes the re-layout of the Flash,re-planning the 

structure of the bootloader,setting the status flags to automatically jump to the UA module,and optimizing the algorithm 

about reading and writing the flash. 

Keywords:ARM.firmware,Device Manager,auto upgrade 

目前,基于ARM的嵌入式终端设备(如:PDA、移动电话、电 SDRAM内存空间和128MB Flash空间。Flash片选连接到了 

子仪表、MP4等)上的软件系统出现了bug,或有新的应用功能 

PA×270的nCS0上,对应地址为0x0,SDRAM片选连接到了 

需要扩展,或相关系统配置需要更新管理时,往往需要到特定的 

PAX270的nSDCSO上,对应映射地址为0xaO000000。 

客服中心进行软件刷新,费时费力,况且嵌入式设备的系统参数 

C K onenaad 

和硬件配置差异性很大,客服中心需要维护这些待更新软件,也 

是件非常繁琐的事情。 

tC ̄F.4WECAVD 

美国奔峰公司提出了一套通用规范——DM(Device Man- 

IN11,鼗 V 

agement),即开放移动联盟(OMA)无线方式管理终端规范的简 

i 由eI 1_ 

A ,0 /1 I 雌RA^羞【tKB)I 

称。该规范可以对放置在远程服务器需更新的软件差分包(即待 

更新软件版本和当前软件版本的差异信息包)进行管理,并通过 

/1 

、J^ d|I 吲 I l— 

OMA下载(DL)协议与移动终端进行数据的交互,并触发终端 

Dat ̄0:lS) 

的自动更新动作,完成软件版本的自动升级 I o本文主要针对 

、\l l 嘲I 

DM底层的UA(Update Agent)规范在Linux智能手机上实现 

图1 PXA270与OneNAND连接示意图 

固件的自动升级。 

在此架构上,要实现底层的升级功能,必须从Bootloader 

该实施方案对Linux智能手机上的Flash进行了重新布 

中实现UA模块的跳转,然后从Flash位置0x07500000读出升 

局,对Bootloader进行了重新规划,对差分包的读、擦、写算法 

级差分包,并执行升级动作。UA的底层升级示意图如图2所示。 

进行了优化实现。实施结果和实测数据表明,提出的方案能很好 

同时考虑到嵌入式Linux系统的相关应用较多、配置较复杂以 

的满足终端软件的自动升级功能,方案的优化处理使得用户在 

及bug较多的情况,可能会导致两个相邻版本之间的差分包出 

使用上也能得到较满意的用户体验。 

现很大的情况。因此,必须给差分包预留出足够的空间,本方案 

本文主要参考DM的客户端规范,前后版本差分包的获取 

中,为了避免在升级过程中系统出现异常,差分包被放置在 

可从网络服务器上自行下载,然后通过数据线拷贝到嵌入式设 

》正常纛动 /受囊詹敝车 

备存储器的指定位置上(也可通过无线网络直接下载到终端), 

Linux 

重启手机终端后通过检查特定位置是否有差分包文件即可决定 

kernel-I ̄h'opim I 

是否启动升级工作。因此即使针对没有带无线通信模块的Linux 

嵌入式终端设备,本方案也可实施。 

]R ̄Iu 厄 

1 实施方案 

——— 

__——_1/

Cz)I

一杼丹纽 

本方案是基于Intel PAX270应用处理器圜和三星OneNAND 

竺 竺 !!r 

LASH:0x075000 ̄0 

Flasht0 的硬件架构,在该处理器上运行Linux内核和应用软件。 

SDRAM:口xA0帅0000 

硬件连接方式如图1所示。其中选取的OneNAND具有64MB 

图2 UA升级流程示意图 

海南大学青年基金资助项目(qnjjl185);海南大学应用科技学院院基金资助项目(yykj—ky-2010-3) 

12 

Flash的末端(0x07500000的 

攒留块 

位置),分配了40个Block 

靛分甑 

(Block936至Block976,一个 

Block为128KB)的空间。修改 

用户文件系统 

后的Flash的布局情况如图3 

鬣惰息 

所示。 

檄文件系统 

另外,考虑到速度的因素, 

Linuz内棱 

在执行升级动作时,必须使能 

DMUA 

MMU和D—Cache,同时进行 

硬件潮试 

LCD和uart的初始化,以便用 

onoaderl I

户可以看到升级过程和开发人 

 0

 

doB如r2 

员从串口打印调试信息。 

图3 Flash整体布局 

PAX270采用的是MarvelI公 

B B 

司的XScale架构,执行ARM V5TE架构指令 ,MMU和D— 

Cache的使能代码如下:

呲 晰 胁 

枷 

 

mrc pl5,0,rO,cl,cO,0 

err rO,rO.#0x1 

orr r0,r0,#0x4 

mcr pl 5,0,rO,cl,cO,0;enable MMU and D—Cache 

. . 

\ 

2关键工作及优化实现 

2.1 Bootloader的重新规划 

UA升级模块所在的存储空间地址位于内核之下,因此必须 

重新规划现有的Bootloader。版本升级时,需要在Bootloader2 

中引导出UA,在UA中调用Ua_doUpdate 

()函数完成Flash的擦写,实现升级工作。这 

Bootloader] 

里没有把UA和Bootloader2整合在一起, 

BootIoader2 

而放在一个独立的分区中,主要的目的有两 

 lUa loader I 

个:①如果服务器侧的差分包生成算法或数 

UA l 

据结构有变化的话,可以进行自升级动作; 

②便于模块的维护。重新规划后的Boot一图4重新规划后 

loader如图4所示。 的Bootloader 

目前Bootloaderl和Bootloader2共占用一个Block,UA 

分区也占用一个Block,存储区中总共有8个分区,分区信息保 

存在gstXSRPartl的结构体全局变量中,规划代码如下: 

gstXSRPa ̄l nNumOfPartEntry=8: 

/ bootloader / 

gstXSRPart1.stPEntry [O】nID =PARTITION—ID—NBL1 IPARTI- 

TION

IDNBL2; 

gstXSRPart1.stPEntry[0]nAttr=BML—PI—ATTR—RO; 

gstXSRPartl stPEntry[0].nlstVbn=O: 

gstXSRPa ̄l stPEntry[0].nNumOfBIks=1: 

/ DM UA / 

gstXSRPartl stPEntry[1】nlD=PARTITION—USER—D 

EF

BASE I PARTITION

ID

NBL3; 

gstXSRPartl stPEntry[1]nAttr=BML—PI—ATTR—RO; 

gstXSRPart1.stPEntry[11 n1 stVbn:3: 

gstXSRPartl sfPEntryf1】nNumOfBIks=1: 

2l2标志位的设置与更新 

把差分包放置到存储器的指定位置,终端若发现在指定的 

位置上有差分包存在,则设置好标志位,并通知用户是否需要进 

行升级工作,若需要则重启终端,Ua loader能够通过标志位判 

断是否需要启动UA。为了防止异常修改,标志位被放置在差分 

包分区的最后一个Block的位置,即FLASH—STATUS_ADDR: 

Linux智能手机上自动升级模块的设计与实现 

D×079EO00O。在终端设备重启后,Ua_loader先从FLASH—STA— 

TUS

_

ADDR的位置读出一个32位的无符号整数,uaw_flash—read 

((UINT8 )(&isUpdate),(volatile UINT8 )(FL-ASH—STATUS_AD 

DR),4):然后再用读出的isUpdate值与更新状态值进行逻辑与。 

更新完成后,需要对更新标志位进行复位,同时设置更新完 

成状态标志位,在FLASH—STATUS—ADD+4的位置写入更新结 

果,写入该值的目的是一旦更新失败,可以调出该值分析失败原 

因。状态值的设置如下: 

#define UA_UPDATE_STATUS—BIT(0x01<<3)//bit 3为0则不更 

新,为1则实施更新 

#define U UPDATE

STATUS

REPORT(0x01<<1)//bit 1为1 

则更新成功,为0表示更新失败 

2,3 UA引导 

实现UA的引导,首先要设定一个在SDRAM上的映射地 

址,然后从flash中读出UA镜像到SDRAMD的映射地址,并 

在该地址处开始执行,连接器找到汇编人口点,在init s[5】中跳 

转到UA主函数C—StartUp开始执行UA更新。引导示意图如 

图5所示。主要代码如下: 

主要代码如下: 

#define UA

_

SHADOV ADDR

BASE 0xA0000000//定义映射地址 

pJumpAdd r=ShadowtoUA(nVo1);//装载UA image到SDRAM,并 

返回映射地址 

run=(void( )(void))pJumpAddr;//跳转到UA执行 

run(): 

图5引导示意图 

2.4读、擦、写算法的优化实现 

要把版本差异信息进行解释后更新到当前的版本中,就必 

须针对差分包特点实现对Flash的读、擦、写操作,考虑到篇幅, 

以写操作为例进行说明,传统算法说明如下。 

步骤1解析参数,获取第一个要写的扇区号,并计算得到 

要写入的总扇区数,以及对Block取余后的剩余字节数。 

步骤2把Flash中要擦写的块备份到SDRAM。 

步骤3根据差分包信息对SDRAM中的块进行相应的修改。 

步骤4擦除Flash中需要修改的块。 

步骤5把SDRAM中修改完成的块写入Flash。 

该算法可以完成写操作,但考虑到Flash为Nand Flash, 

对擦、写速度有一定的影响,另外,DM要求可以对Flash的任意 

地址,任意字节进行读、擦、写操作。该算法对任意地址和任意人 

小的写操作都实施了同样的操作流程,显然当擦写的数据块很 

多,很频繁时则会耗费很长的时间。 

为了减少冗余操作,提高在升级过程中条件匹配的命l{J率, 

将会大大减少升级所需的时间。优化后的算法如图6所示。 其 

中,备份到SDRAM中的地址为:0xa0600000,nSpareSct的值 

为(ua_u32)addresso/)oSCTOR—SIZE,nSpareSctS的值为size% 

B B 

呲 

《工业控制计算机》2012年第25卷第6期 13 

SCTOR

SIZE。一个扇区的大小定义为#define SCTOR—SIZE 

步骤2在升级前获取当前时间的秒数;升级完成后再获取 

0x200。 

次系统时间。 

步骤3相减后可得出升级所需的秒数。 

参教: 

Addre ̄:目 

3.3实验结果及数据分析 

uaw lfash wrl ̄(ad>/ Soizuer;ce数t据文涌羞 

正确性验证实验结果参见表1所示。 

表1正确性验证结果 

解拆参数,获取nSpareSct 

和nSpareSctSl ̄值 

编 实验项目 升级结果 

号 (通过:√失败:×) 

1 修改了linux kerne1 √ 

2 修改了应用功能 √ 

3 扩展新功能 √ 

4 修改配置信息 √ 

直接耐块进行写操佧l I 蔷份块到sdram 

‘ 

5 升级过程中断电重启 √ 

I 修改Idnm中的块 

r ‘ 

通过表1的实验结果,可看出该方案不仅可行而且在健壮性 

( 缀雍 ) I在写八之前擦除褶应的块 

上有较好的表现。由于篇幅限制,实验样本数据没有全部列出。 

● ● 

一 撇焉 

差分包的更新时效分析参见图7所示。 

由图7中的对比数据说明. 600 

图6优化后的算法 

算法优化后的时效性比优化前 500 

3验证及结果分析 

得到了显著的提高。说明条件匹 

3.1软硬件环境 

配的命中率还是可观的。因为 200 

500KB的差分包已非常大,在 10

0 

(1)硬件环境 

CPU:lntel Xscale PXA270 

实际情况中很少出现,所以。优 50 100 200 300 400 500 

Flash:三星OneNAND 

化后的升级时间用户完全可以 n包划、( 

LCD:240 320,通过LED驱动芯片驱动4个串联LED。 

接受。另外,需要说明的是,差分 图7更新时间对比图 

(2)软件环境 

包的大小和升级时间不成线性关系,甚至可能出现差分包小,而 

Bootloader:PXA270 bootloader 

升级时间更长的情况。这是因为升级时间主要由需要擦写块的 

OS:Linux kernel 

多少和是否需要频繁擦写来决定的。 

APP:qt+qtopia 

3-2实验方法 

参考文献 

从两方面进行实验验证。 

[1]奔峰电子(北京)有限公司.一种电子设备及其管理系统:中国,CN18 

(1)软件升级的正确性 

63095[P]2006—1 1—15 

步骤1分别修改Linux Kernel、修改应用功能、添加新应 

[2]伍春天,段哲民.基于PXA270的智能手机硬件系统设计[J]微处理 

用功能、修改配置信息后生成四个对应的新软件版本,用新版本 

机,2009(3):119-121 

制作出四个与原始软件版本的差分包。用下载工具把差分包事 

[3]陈晓风OneNAND Flash的操作性能与应用研究[J].海峡科学,2008 

(12):48—52 

先放置在Update package分区,更新标志位置为1,分别做四 

[4]兰婧,朱怡安,袁磊.基于PXA270嵌入式系统的Bootloader研究与 

次升级验证。 

实现[J]计算机工程与设计,2009(21):4881—4883+4906 

步骤2在升级过程中断电,重启终端后,看是否能重启升 

[5]Andrew N.Sloss,Dominic Symes,Chris Wright.ARM嵌入系统开 

级动作。 

发一软件设计与优化[M]沈建华,译北京:北京航空航天大学出版 

(2)升级所需的时间 

社.2005 

步骤1设计一个获取当前系统时间的函数,时间值以秒为 

f收稿日期:2012.1.31] 

单位。 

(上接第10页) 

参考文献 

经过主、备切换以后,原备用控制器升为主控制器。此时新 

[1]朱耿华.工业控制器冗余方案的设计与实现[J]自动化博览,2008 

控制器需要完成如下工作:通过USART1的USART1_TX引脚 

(6) 

发送自己的“心跳”信号;继续运行主、备切换之前原主机运行的 [2]萄冬荣,刘海清.双机容错计算机系统的设计与实现[J].计算机工 

任务以及定时将采集到的数据和运算结果同步地传输到现在的 

程,2008,34(15) 

备用控制器端;同时,发出报警信息提示原主控制器发生故障, 

[3]毛南.实时双机嵌入式容错系统的研究及应用[D]北京:中国农业大 

通知维修人员及时进行维修。 

学.2007 

5结束语 

[4]杨云波二模容错计算机系统研究与设计[D].西安:西北工业大学, 

实践表明该系统能够实现主/备身份确认、数据输入/输出, 

2002 

能够实现故障自检、主/备切换。 

[5]张金森.基于ARM9 DCS主机冗余系统的设计和实现[D]西安:西 

安石油大学.2008 

f收稿日期:2012.2.21] 


本文标签: 升级 进行 实现 差分 需要