为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

SD卡升级

2017-09-19 3页 doc 22KB 68阅读

用户头像

is_511210

暂无简介

举报
SD卡升级一个嵌入式Linux系统从软件的角度看可以分为四层:Bootloader,Linux内核,文件系统和应用程序。四个层次中Bootloader一般是按照嵌入式硬件配置定制的,是嵌入式系统加电以后运行的第一段软件代码。要对Bootloader进行升级一般只能通过人工手动完成。用户程序是运行在Linux上的一个程序,其升级方法很简单,一般可以通过网络进行升级。Linux内核和文件系统的升级一般是在Bootloader阶段实现的。 通过对uboot进行扩展,加入系统升级功能,方案如下: 设备重启首先运行uboot,在这过程中U-Boo...
SD卡升级
一个嵌入式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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索