基于Linux平台的OTA升级方法

文档序号:6337939阅读:7734来源:国知局
专利名称:基于Linux平台的OTA升级方法
技术领域
本发明涉及一种OTA升级方法,具体涉及一种基于Linux平台的OTA升级方 法。
背景技术
OTA (Over-the-Air Technology)即空中下载技术,是通过通信的空中接口对SIM
卡数据及应用进行远程管理的技术。随着人们对生活水平的高要求,以及芯片处理能力 不断提升,数字机顶盒作为未来数字电视广播业务的终端设备,也由单功能向多功能发 展,这就要求必须要有灵活的升级程序来保证新增加的功能安全稳定的升级到用户的机 顶盒中。传统单功能的引导加载程序不能实现多架构系统的支持以及功能扩展,U-boat 作为一种通用的成为了嵌入式开发引导加载的首选。随着应用的不断丰富,容量成为必须考虑的因素,NandFlash具有单位容量价格 低廉,擦写速度快,成为了嵌入式开发的首选存储设备。支持Nand Flash的文件系统也 相当多,熟悉的有U盘使用的Fat格式,jffs以及本文使用的yaffs文件系统。目前尚无用yaffs文件系统、nand flash实现OTA升级。

发明内容
本发明提供了一种可以完全升级kernel,ramdisk以及其他各种文件系统的OTA
升级方法。它不受内核版本限制,非常灵活,甚至可以升级U-boat和loader本身,实现 了完全的全能升级。即使出现各种意外情况,也能很方便的升级,甚至用户自己也能通 过我们提供的升级程序简单操作便能完成升级。本专利的思路是利用Yaffs文件系统对Nand Flash的良好支持,在kernel中添 加yaffs文件系统的支持,通过将升级信息打包成ts流传送到用户机顶盒接收,机顶盒程 序根据接收的ts流进行解析,判断出需要升级的部分,并将升级的基本信息保存在指定 的文件中,然后自动重启机顶盒,u-boot中读取升级文件,并写入到指定的flash地址, 然后跳转到loader,loader读取指定地址,并解析出升级信息中所需的频点,符号率等信 息,将升级信息加载到内存中,再写入flash中;重启后进入机顶盒程序,正常执行,完 成所有升级功能。u-boot作为通用的boot loader,已经很广泛的在各个嵌入式产品上使用。其支持 架构的广泛性,代码控制的方便性,以及其灵活的移植性和方便的命令操作模式,都让 其成为通用引导程序的霸主。在U-boot添加了 U盘的支持,可以直接通过U盘升级,移 植了 yaffs文件系统,让其可以直接和操作系统下面的文件进行通信。即使换一个平台和 架构,也不需要修改太多,便能完成移植,对产品的快速成型有很大的优势。U-boot本 身发展迅速,支持的驱动丰富,所以在实现各种扩展功能时有丰富的代码作为参考,对 节约产品开发时间提高效率有很大的效果。本发明是这样实现的
一种基于Linux平台的OTA升级方法,包括如下步骤步骤一机顶盒接收并读取升级信息,将升级信息保存在指定的文件中,保存 完后调用重启命令,重启机顶盒;步骤二 重启机顶盒后进入u-boot,首先挂载yaffs文件系统,读取指定的文件 中是否有升级参数文件,如果有且不为空,再读flash地址上保存的flag参数值,当flag参 数值等于0时,表示上次升级成功,机顶盒正常执行比较版本号并删除升级参数文件; 当flag参数值等于1时,表示需要升级,则读取参数文件到内存,并保存到flash固定地 址,然后直接跳转到loader程序;步骤三loader程序首先读取保存到flash固定地址的参数文件,解析出需要使 用的参数后,执行升级,并将升级信息加载到内存中,再写入到flash指定地址,升级完 成后,loader程序将flag值改为0 ;步骤四重启机顶盒,进入机顶盒程序,即完成所有升级功能。更进一步的方案是所述的升级信息可以采用ts流或者U盘的形式发送。更进一步的方案是所述的yaffs文件系统根据实际的flash地址分布,给yaffs 设备文件赋值Startblock和endblock,其数值是以块为单位。更进一步的方案是所述挂载yaffs文件系统是指向u-boot启动过程中已经初始 化了 mtd设备;然后根据该nand flash的数据手册,赋值上相应的属性,并指定相应的读 写操作函数,完成yaffs设备的初始化;然后根据指定的分区来查找到挂载点,挂载点由 startblock 禾口 endblock 来指定;更进一步的方案是所述挂载yaffs文件系统在挂载过程中需要检查yaffs—tag, 其位于nand flash的spare区中。更进一步的方案是所述的yaffs文件系统的标志保存在nand flash的OOB的保
留区剩余的8个字节。更进一步的方案是所述的yaffs文件系统志保存在nand flash的OOB的512至 515字节和518至519字节和523至524字节。Yaffs文件系统不仅充分利用了 Nand Flash的空间,将OOB区部分字段作为yaffs
文件的标志,还大大提高了加载速度。Yaffs文件系统对大容量的存储设备支持较好,为 以后扩展也提供了很大的优势。Yaffs采用垃圾回收机制,对Nand Flash本身的很多问题 如位反转,坏块等都有很好的处理方法,也为数据安全提供了保障。对升级程序的代码使用了功能块宏定义控制,将每一个独立的功能都以一个宏 来控制,遵循U-boot代码的编程风范,完全实现了灵活控制和代码的规范性,方便更多 次的开发。Linux丰富的系统接口和广泛的驱动支持,以及号称一行脚本能当10句代码的 shell脚本语言,都能使开发方便,功能扩展具有很大的优势。Linux本身对网络支持较 好,对以后开展3网融合业务都有很大的优势。本发明具有如下的优点1、充分考虑了升级的安全性,对断电考虑严密。2、使用通用U-boot,支持平台广泛。3、U-boot中支持U盘升级,支持yaffs文件系统
4、使用底层升级方法,可以全面满足所要升级的程序。5、使用yaffs文件系统,对Nand Flash支持较好6、全系列的C代码,便于移植7、使用宏开关控制选项,实现可调可控,使用灵活。8、充分利用Iinux的优势,使用shell完成复杂功能。


图1为本发明机顶盒升级流程图;图2为Nand flash中yaffs信息的示意图;图3为Yaffs读写的流程具体实施例方式下面结合附图对本发明做进一步的说明。首先,移植yaffs文件系统到u-boot下,根据实际的flash地址分布,给yaffs设 备文件赋值Startblock和endblock,其数值是以块为单位。Nandflash以页为单位读写数据,而以块为单位擦除数据。一个page分为 512Bytes的数据区和16Bytes的Spare区,数据区又以256bytes分为前后两段,分别进行 ECC校验。所以在读写Nand Flash时的指令也分了三个ReadA(OOh) ; read B (Olh); read C(50h),这三个指令分别对应了读写前256bytes,后256bytes,和Spare区(又叫 OOB区)。Spare区中保存有数据区的校验码,其中有8个字节和yaffs文件系统相关, 保存了 yaffs的标志信息,详情见图2。typedef Stmctjunsigned chunkld 20 ;unsigned serialNumber 2 ;unsigned byteCountLSB 10;unsigned objectld 18 ;unsigned ecc 12 ;unsigned byteCountMSB 2 ;}yaffs—Tags ;Yaffsjags的数据的正确性直接影响yaffs文件系统是否能正确的被挂载上。由于yaffs—tag在nand flash中的Spare区是不连续的,所以通常通过typedef uni on {yaffs—Tags asTags ;—u8asBytes[8];}yaffs—TagsUnion ;来进行转换。每一页的前512字节存放的是数据,第517位是块状态,此位的作用是检测是否 是坏块,在出厂时,若此位不是FF则表示为坏块,坏块表也是读取该位来进行建立的。Yaffs文件系统便是充分利用了 nand flash的OOB的保留区剩余的8个字节来做为yaffs文件系统的标志,进行判断yaffs系统。开发过程中使用www.Stlinux.com提供的st-uboot代码,其u_boot版本是1.3.1。 不支持yaffs文件系统,所以我们需要建立u-boot 1.3.1对yaffs的支持。可以从www.yaffs. net或者http //www.alephl.co.uk/yaffs下载yaffs文件系统的源代码,主要移植 direct 目 录中的代码,其代码中主要包含yaffs—gut s.c 主要的 yaffs 算法文件。yaffs—ecc.c yaffs 的 ecc 校验代码yaffs—mtdif.c yaffs 的 mtd 层接 口 文件yaffs—nand.c yaffs 的 flash 抽象接 口 文件yaffscfg.c yaffs 配置文件。在u-boot目录中的fs目录下建立yaffs2目录,可以将yaffs2代码目录中的所 有.c; .h文件和makefile文件复制到该目录。在makefile中指定需要编译的代码,删掉多 余的内容,屏蔽掉所有kernel中使用yaffs文件系统的相关代码,在yaffscfg.c代码中进行
配置,屏蔽掉多余的挂载点,我们只需要一个挂载点/flash。此挂载点就对应于kernel 下文件系统的根目录。主要修改内容,首先进入yaffs—StartUp函数,进行初始化设备的赋值AashDev.nDataBytesPerChunk = 512 ; // 每一页的数据字节数AashDev.nChunksPerBlock = 32 ; // 一土夬有多少页AashDev.nReservedBlocks = 5 ; // 保留块数。flashDev.StartBlock = 192 ; //挂载flash物理地址192起始;根据实际情况修改flashDev.endBlock = 1023 ; //以1023块结束;根据实际情况修改flashDev.useNANDECC = 0;// 等于 0 则使用 YAFFS 自身 ECC,1 用 nand eccflashDev.nShortOpCaches = 10 ; // 使用 cachesflashDev- > isYaffs2 = 0 ; // 虽说 yaffs2 兼容 yaffsl,512bytes 移植只能使用 yaffs 1以下是为yaffs的读写,擦除,以及初始化调用相应的函数。flashDev- > eraseBlocklnNAND = nandmtd—EraseBlockInNAND ;flashDev- > initialiseNAND = nandmtd—InitialiseNAND ;flashDev- > writeChunkToNAND = nandmtd—WriteChunkToNAND ;flashDev- > readChunkFromNAND = nandmtd—ReadChunkFromNAND ;我们使用mtd层来管理yaffs的读写,重点是nandmtd—ReadChunkFromNAND ;和nandmtd—WriteChunkFromNAND ;两个函数。位于 yaffs—mtdif.c 中。挂载yaffs流程是在U-boot启动过程中已经初始化了 mtd设备,在yaffs设备初始化过程中就需 要指向这个mtd设备(Nand Flash),然后根据该nand flash的数据手册,赋值上相应的属 性,比如块数,页大小等,并指定相应的读写操作函数,完成yaffs设备的初始化;然后 根据指定的分区来查找到挂载点,挂载点由Startblock和endblock来指定;在挂载过程中 需要检查yaffs—tag,其位于nandflash的spare区中,所以只需要查找每页这16字节的内容就可以完成整个文件系统的挂载,而不需要像jffs文件系统需要挂载每页所有字节才能 确定文件系统的结构,大大节约了挂载时间。然后进行一些准备工作,初始化一些临时 缓冲区,初始化节点、对象,建立”假目录”,即只存在内存中的如lost+found目录, 最后根据扫描出来的所有tags信息建立文件链表,最后释放缓冲区、验证空余数据区和 块,判断挂载是否成功,完成整个挂载过程。当执行ymount/flash挂载成功后,用yls/flash就能浏览出来烧写到192块起始地 址的yaffs文件系统。注意必须要使用绝对路径,也就是说,在u-boot下使用yls/flash与在Iinux执行“Is/”命令的显示的效果一致。Yaffs读写的流程图见图3 在移植yaffs文件系统过程中主要是进行OOB和yaffs—tag的转换。在u_bootl.3.1 的版本中,可以通过使用md命令查看到相应地址的内存信息,nanddump可以打印出指 定页的数据和OOB,通过对比在kernel正常挂载的yaffs镜像格式和在uboot下nand Spare 的分布可以发现,Spare中yaffs—tag和ecc的位置发生了变化。也可以根据制作yaffs镜 像工具的源代码来进行分析。默认分布所以在nandmtd—ReadChunkFromNAND 函数中, 调用 translate— oob2spare(spare, spareAsBytes);来进行OOB数据的转换。在此函数中,将读出来的
OOB数据之后重新赋值为新的OOB布局,达到正确显示效果。在写数据时,需要先进 行OOB转换,再写入数据。U-boot跳转升级程序(loader),主要是考虑到loader的入口地址和加载地址,通 过bootm来启动,这样可以压缩loader,减少空间使用。通过mkimage命令生成u_boot 格式支持bootm的文件。使用u-boot烧写yaffs文件系统,还需要在u_boot的nand write 命令中添加对yaffs的支持,可以模仿写jffs2文件系统的命令,主要添加对OOB的操作 opts.writeoob = 1 ;Kernel还没有自身支持yaffs文件系统,所以还需要在kernel下面支持yaffs文件 系统,将源代码解压后,进入源文件目录执行./patch-ker.sh c/opt/STM/STLinux-2.3/devkit/sources/kernel选项c表示复制到kernel目录,后面跟kernel的路径即可。然后进入kernel配置,选择File System-Miscellaneous filesystemsLin<*>YAFFS2 file system support重新编译之后,运行cat/proc/yaffs有显示表示已经支持了 yaffs文件系统。通过判断指定目录的文件是否存在,并读取升级的环境变量来判断是否需要升 级。经过以上设置,就可以及时进行升级,升级流程如下见附图1,在机顶盒正常使用过程中,通过接收TS流,或者读取U盘信息,如 果TS流或者U盘中包含了需要升级的信息,则将升级信息读出来保存为指定的目录的指 定文件,保存完了之后调用重启命令,重新启动机顶盒。重启之后进入U-boot,首先挂载yaffs文件系统,然后读取指定目录中是否有升级参数文件,如果有并且不为空,再读 flash地址上保存的flag参数值。此flag标志为了防止升级程序不断重复升级。flag = 1 时表示需要升级,flag = 0时表示上次升级成功,且只有升级成功flag才等于0。要升级 则读参数文件到内存并保存到flash固定地址,然后直接跳转到loader程序,loader程序 首先读取刚保存到flash的参数信息,解析出需要使用的参数后,执行升级,最后将升级 程序写入到flash指定地址。升级成功完成后将flag改为0,然后重启。在读到flag = 0 时,跳转到kernel,先比较机顶盒程序版本,如果已经更新,则删除掉指定目录下的升级 参数文件。
权利要求
1.一种基于Linux平台的OTA升级方法,其特征在于包括如下步骤步骤一机顶盒接收并读取升级信息,将升级信息保存在指定的文件中,保存完后 调用重启命令,重启机顶盒;步骤二 重启机顶盒后进入u-boot,首先挂载yaffs文件系统,读取指定的文件中是 否有升级参数文件,如果有且不为空,再读flash地址上保存的flag参数值,当flag参数值 等于O时,表示上次升级成功,机顶盒正常执行比较版本号并删除升级参数文件;当flag 参数值等于1时,表示需要升级,则读取参数文件到内存,并保存到flash固定地址,然 后直接跳转到loader程序;步骤三loader程序首先读取保存到flash固定地址的参数文件,解析出需要使用的 参数后,执行升级,并将升级信息加载到内存中,再写入到flash指定地址,升级完成 后,loader程序将flag值改为O ;步骤四重启机顶盒,进入机顶盒程序,即完成所有升级功能。
2.根据权利要求1所述的基于Linux平台的OTA升级方法,其特征在于所述的升级 信息可以采用ts流或者u盘的形式发送。
3.根据权利要求1所述的基于Linux平台的OTA升级方法,其特征在于所述的yaffs 文件系统根据实际的flash地址分布,给yaffs设备文件赋值startblock和endblock,其数值 是以块为单位。
4.根据权利要求3所述的基于Linux平台的OTA升级方法,其特征在于所述挂载yaffs 文件系统是指向u-boot启动过程中已经初始化了 mtd设备;然后根据该nand flash的数据 手册,赋值上相应的属性,并指定相应的读写操作函数,完成yaffs设备的初始化;然后 根据指定的分区来查找到挂载点,挂载点由startblock和endblock来指定。
5.根据权利要求4所述的基于Linux平台的OTA升级方法,其特征在于所述挂载yaffs 文件系统在挂载过程中需要检查yaffs—tag,其位于nandflash的spare区中。
6.根据权利要求1所述的基于Linux平台的OTA升级方法,其特征在于所述的yaffs 文件系统的标志保存在nandflash的00B的保留区剩余的8个字节。
7.根据权利要求6所述的基于Linux平台的OTA升级方法,其特征在于所述的yaffs 文件系统志保存在nand flash的00B的512至515字节和518至519字节和523至524字 节。
全文摘要
本发明提供了一种基于Linux平台的OTA升级方法,包括如下步骤步骤一机顶盒接收并读取升级信息,将升级信息保存在指定的文件中,保存完后重启机顶盒;步骤二进入u-boot,挂载yaffs文件系统,读取参数文件到内存,并保存,跳转到loader程序;步骤三执行升级;步骤四重启机顶盒。本发明充分考虑了升级的安全性,对断电考虑严密,支持平台广泛,使用底层升级方法,可以全面满足所要升级的程序;使用yaffs文件系统,对Nand Flash支持较好;全系列的C代码,便于移植;使用宏开关控制选项,实现可调可控,使用灵活;充分利用linux的优势,使用shell完成复杂功能。
文档编号G06F9/445GK102012831SQ201010577398
公开日2011年4月13日 申请日期2010年12月8日 优先权日2010年12月8日
发明者刘海润 申请人:四川金网通电子科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1