基于ARM的嵌入式Bootloader实现自动升级
Stage1的主要任务如下:初始化计时器,初始化网络,初始化Flash,装载内核映像和文件系统映像,初始化命令控制台等。进入stage1的汇编代码如下:
adr r0 , load_addr //@get stage1 entry point
ldr r9 , [r0 , #0x0c]
3 本实验基本原理
(图 2) |
本实验对 Bootloader的功能进行了扩充,加入自动升级的功能。即:用户需要对目标板的内核或文件系统进行升级,只需要将新的映像文件拷贝到CF存储卡或移动硬盘中,然后将CF卡或移动硬盘插入目标板相应的插槽,每次重启目标板时,先启动Bootloader,初始化硬件环境后,在应用程序运行前,判断是否存在要升级的文件,如果存在则先把Flash指定的位置的内容擦除掉,然后再把要升级的内核或文件系统的映像文件写进相应的位置,写完后立即删除CF存储卡或移动硬盘上的升级文件,即完成升级。如图2
项目开发板上有一块8M Byte的Flash和二块32M Bit的DDR SDRAM。Flash的起始地址映射到0x00000000,其布局如下[7]:
(Flash布局图)
如图所示,在虚拟地址位置0x00030000(实际物理地址为0x46030000)擦除和重写内核与文件系统映像文件。要对CF卡或移动硬盘进行文件存取,必须将CF卡或移动硬盘格式化成某种文件系统。本实验所编写的Bootloader主要支持3种文件系统:FAT16,FAT32,EXT2。系统启动时,Bootloader首先检测CF卡或移动硬盘的文件系统类型,然后按照相应的文件系统格式查询CF 卡或移动硬盘的所有文件。若发现有更新的映像文件,则读CF卡的操作,CF卡的驱动见文献[3],将映像文件读到SDRAM中,再从SDRAM烧写到嵌入式开发版的Flash中,实现升级。
生成内核和文件系统步骤如下:
1)进入linux的armutils_2.5.127.0目录下执行make linux-config,裁剪uClinux的配置;
2)make linux 生成kernel-2.4.22-dtv-EM8624L-romfs.bin ,这是uClinux的内核;
3)make rootfs 生成rootfs-dtv-EM8624L-romfs.ext2,这是root文件系统;
4)make romfs 生成romfs-dtv-EM8624L-romfs.bin.gz,这是rom文件系统。
评论