SD卡升级一个嵌入式Linux系统从软件的角度看可以分为四层:Bootloader,Linux内核,文件系统和应用程序。四个层次中Bootloader一般是按照嵌入式硬件配置定制的,是嵌入式系统加电以后运行的第一段软件代码。要对Bootloader进行升级一般只能通过人工手动完成。用户程序是运行在Linux上的一个程序,其升级方法很简单,一般可以通过网络进行升级。Linux内核和文件系统的升级一般是在Bootloader阶段实现的。
通过对uboot进行扩展,加入系统升级功能,方案如下:
设备重启首先运行uboot,在这过程中U-Boo...
一个嵌入式Linux系统从软件的角度看可以分为四层:Bootloader,Linux内核,文件系统和应用程序。四个层次中Bootloader一般是按照嵌入式硬件配置定制的,是嵌入式系统加电以后运行的第一段软件代码。要对Bootloader进行升级一般只能通过人工手动完成。用户程序是运行在Linux上的一个程序,其升级方法很简单,一般可以通过网络进行升级。Linux内核和文件系统的升级一般是在Bootloader阶段实现的。
通过对uboot进行扩展,加入系统升级功能,
如下:
设备重启首先运行uboot,在这过程中U-Boot完成系统初始化之后,在引导内核之前先检查SD卡中是否有内核和文件系统映像,若有则读取映像到SDRAM中,然后通过U-Boot中的Flash命令将内核或文件系统烧写到Flash的对应分区中来完成升级,若无则直接启动系统,具体流程如下:
U-Boot工作原理:
U-Boot的启动过程分为两阶段。第一阶段由汇编语言实现,与具体硬件平台相关;第二阶段由可读性和可移植性较好的C 语言实现,完成U-Boot 的主要功能。这样
的优点在于可以把基于硬件的代码与系统的通用代码划分开,使得系统的移植工作主要针对第一阶段代码进行修改,而无需或只需少量修改第二阶段代码,简化了移植过程,提高了系统开发效率。
U-Boot第一阶段代码实现的主要功能有:
(1)硬件设备的初始化;
(2)为加载Bootloader 第二阶段准备RAM 空间(即初始化SDRAM);
(3)复制Bootloader 第二阶段代码到RAM 空间(U-Boot拷贝其全部代码到RAM);
(4)设置堆栈;
(5)跳转到第二阶段C代码入口处。
当系统完成代码搬运并设置好C 语言使用的堆栈等环境后,就会跳转到内存中的第二阶段代码C语言入口处继续运行。第二阶段代码完成的主要功能有:
(1)继续初始化相关硬件设备(如串口、系统时钟及定时器等);
(2)检测系统内存映射;
(3)加载内核映像及根文件系统映像;
(4)设置内核启动参数;
(5)调用内核。
第二阶段的U-Boot在设置好相应的终端设备后会停止等待若干秒,如果在该时间段内串口有输入,则U-Boot进入交互下载模式,循环读取串口命令并执行;如果串口没有输入,则U-Boot执行启动加载模式代码,将操作系统内核加载到内存并启动系统。
3、U-boot扩展升级
U-boot本身并不带升级功能,需要对其进行扩展已完成升级功能,将内核和文件系统烧写到Flash的相应分区中,本方案是针对TI8127,它具有512MB的SDRAM和256MB的的NAND Flash,NAND Flash的起始地址映射到0x0,SDRAM的起始地址映射到0x81000000,NAND Flash分为U-Boot-min、U-Boot、Kernel、File System等几个分区,分区的起始地址和大小如下:
分区名
起始地址
大小
U-Boot-min
0x0
0x20000
U-Boot
0x20000
0x60000
Kernel
0x00280000
0x00300000
File System
0x006C0000
0x5000000
升级的扩展功能主要是在U-boot的第二阶段完成,在U-boot完成外围硬件初始化之后,检测是否有SD卡插入,如有有则继续检测SD中是否有内核和文件系统映像,如果有相应的映像文件就启动相应的升级工作,升级完成后启动新的系统。系统升级核心工作可以分为两步,第一步是将相应的镜像读取到SDRAM,第二步是将SDRAM中的镜像写入到相应的Flash分区中,详细流程图如下:
通过上面的分析可以看出,扩展一个支持SD卡升级功能的U-Boot需要完成以下步骤:
1)判断是否存在SD卡,通过使用U-Boot提供的find_mmc_device函数,这里只要判断函数的返回值即可知道是否存在SD卡。
2)检测ENV环境变量update字段,如果为0或者不存在则进行下述步骤,否则设置update为0并退出升级过程。
3)判断SD卡是否有映像文件,如果存在则将其烧写到Flash的相应分区,实现这个功能需要使用U-Boot的run_command函数, 检查内核映像是否存在也是通过执行命令的方式,如果存在那么ENV环境变量fileexist的值就是YES,并且此时映像已经加 载到SDRAM中,可以直接通过命令将其烧写到Flash的对应分区中。
4)多次重复上述步骤,直至所有映像都已加载完成。
5)设置update字段为1,重启系统。
示例代码如下
1、判断是否存在SD卡,通过使用uboot提供的find_mmc_device函数,这里只要判断函数的返回值即可知道是否存在SD卡。示例代码如下:
mmc = ind_mmc_device();
if(NULL == mmc)
return;
else
mmc_init(mmc);
2、判断SD卡是否有内核映像文件
如果存在则将其烧写到Flash的相应分区,实现这个功能需要使用uboot的run_command函数,因为内核的镜像文件一般不超过5M,所以在烧写内核映像时不需要检查镜像的大小,检查内核映像是否存在也是通过执行命令的方式,如果存在那么env环境变量fileexist的值
就是YES,并且此时内核映像已经加载到SDRAM中,可以直接通过命令将其烧写到Flash的对应分区中。具体代码实现如下:
#define FINDKERNEL “fatload mmc 0 0x81000000 uImage”
将uImage下载到SDRAM的0x81000000 地址处
#define WRITEKERNELTOFLASH “nand erase 0x00280000 0x00300000;fnand write.i 0x81000000 0x00280000 0x300000”
一是擦除分区,二是写入分区
检测是否有内核映像文件,存在则下载到SDRAM中
Run_command(FINDKERNEL,0);
Ret = getenv(“fileexist”);
If(strcmp(ret,”YES”) == 0)
{
Run_command(WRITEKERNELTOFLASH ,0);
}
获取大小getenv(filesize)
3、判断SD卡是否有文件系统文件,方法同上
本文档为【SD卡升级】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。