U-BOOT环境变量实现
UBOOT命令详解

常用U-boot命令详解(z)2010-09-30 15:05:52| 分类:学习心得体会|字号订阅U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的U-boot-2009.11中的命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。
而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。
[u-boot@MINI2440]# versionU-Boot 2009.11 ( 4月04 2010 - 12:09:25)[u-boot@MINI2440]# vU-Boot 2009.11 ( 4月04 2010 - 12:09:25)[u-boot@MINI2440]# baseBase Address: 0x00000000[u-boot@MINI2440]# baBase Address: 0x00000000由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。
所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧!(1)获取帮助命令:help 或?功能:查看当前U-boot版本中支持的所有命令。
[u-boot@MINI2440]#help?- alias for'help'askenv - get environment variables from stdinbase - print or set address offsetbdinfo - print Board Info structurebmp - manipulate BMP image databoot - boot default, i.e., run 'bootcmd'bootd - boot default, i.e., run 'bootcmd'bootelf - Boot from an ELF image in memorybootm - boot application image from memorybootp - boot image via network using BOOTP/TFTP protocolbootvx - Boot vxWorks from an ELF imagecmp - memory compareconinfo - print console devices and informationcp - memory copycrc32 - checksum calculationdate - get/set/reset date &timedcache - enable or disable data cachedhcp - boot image via network using DHCP/TFTP protocol echo - echo args to consoleeditenv - edit environment variableeeprom - EEPROM sub-systemerase - erase FLASH memoryexit-exit scriptfatinfo - print information about filesystemfatload - load binary file from a dos filesystemfatls -list files in a directory (default/)flinfo - print FLASH memory informationfsinfo - print information about filesystemsfsload - load binary file from a filesystem imagego - start application at address 'addr'help - print online helpi2c - I2C sub-systemicache - enable or disable instruction cacheiminfo - print header information for application image imls -list all images found in flashimxtract- extract a part of a multi-imageitest -return true/false on integer compareloadb - load binary file over serial line(kermit mode) loads - load S-Record file over serial lineloadx - load binary file over serial line(xmodem mode) loady - load binary file over serial line(ymodem mode) loop - infinite loop on address rangels -list files in a directory (default/)md - memory displaymm - memory modify (auto-incrementing address)mmc - MMC sub-systemmtest - simple RAM read/write testmw - memory write(fill)nand - NAND sub-systemnboot - boot from NAND devicenfs - boot image via network using NFS protocolnm - memory modify (constant address)ping -send ICMP ECHO_REQUEST to network hostprintenv- print environment variablesprotect - enable or disable FLASH write protection rarpboot- boot image via network using RARP/TFTP protocol reginfo - print register informationreset- Perform RESET of the CPUrun - run commands in an environment variablesaveenv - save environment variables to persistent storage setenv -set environment variablesshowvar - print local hushshell variablessleep- delay execution for some timesource - run script from memorytest- minimal test like /bin/shtftpboot- boot image via network using TFTP protocolunzip - unzip a memory regionusb - USB sub-systemusbboot - boot from USB deviceversion - print monitor version以bmp指令为例:Usage:bmp info <imageAddr>- display image infobmp display <imageAddr>[x y]- display image at x,y[u-boot@MINI2440]# h bmbmp - manipulate BMP image dataUsage:bmp info <imageAddr>- display image infobmp display <imageAddr>[x y]- display image at x,y(2)环境变量(environment variables,简称ENV)与相关指令和shell类似,U-Boot也有环境变量。
u-boot简单使用手册

u-boot简单使⽤⼿册(转⾃)1.u-boot 简介-----------------------------------------------------------------1.u-boot2.它有两种模式引导模式(⽤于引导OS)下载模式(⽤于开发,在u-boot启动按任意键)进⼊控制台。
在控制台执⾏ boot 命令,则进⼊引导模式去引导OS。
2.u-boot 控制台常⽤命令--------------------------------------------------------------------help 显⽰帮助命令boot ⽤引导常数来引导OS。
bootm 从内存引导OS。
.bootp/tftpboot 从TFTP/BOOTP引导OSgo 从某⼀个地址开始直接运⾏程序mtdparts 管理flash上的分区ping 简单发送⼀个ICMP包测试。
printenv 打印环境变量setenv 设置环境变量saveenv 把内存的环境变量存到flash上的param分区.usbslave 从USB下载⽂件 (PC机要运⾏dnw)version 显⽰u-boot 版本4. 设置环境变量printenv 打印环境变量bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0bootcmd=nboot 0x32000000 kernel; bootm 0x32000000bootdelay=0baudrate=115200ethaddr=0a:1b:2c:3d:4e:5fipaddr=192.168.1.6serverip=192.168.1.8netmask=255.255.255.0stdin=serialstdout=serialstderr=serialmtdids=nand0=nandflash0mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(log)partition=nand0,0mtddevnum=0mtddevname=biosEnvironment size: 453/131068 bytes经常修改是 bootargs ( 启动参数)ipaddr (开发板IP地址)serverip( 默认tftp/NFS/...下载主机)setenv 命令只是改变内存的环境变量值,如果不调⽤saveenv,下次的设置仍然是旧的配置。
烧写ARM开发板系统教程-----uboot、内核以及文件系统

烧写ARM开发板系统教程-----uboot、内核以及⽂件系统⼀、sd启动将u-boot镜像写⼊SD卡,将SD卡通过读卡器接上电脑(或直接插⼊笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.(内存卡的节点)。
当有多个交叉编译器是,不⽅便设置环境变量时,可以在编译命令中指定交叉编译器,具体如下:在源码中操作以下步骤:make distcleanmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- mrpropermake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_configmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl编译出tiny210-uboot.bin,注意交叉编译⼯具路径执⾏下⾯的命令$sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1把内存卡插⼊开发板,使⽤串⼝⼯具设置环境变量:setenv gatewayip 192.168.1.1(电脑⽹关)setenv ipaddr 192.168.1.102(开发板ip,不要与虚拟机和电脑ip冲突)setenv netmask 255.255.255.0setenv serverip 192.168.1.10(虚拟机ip)saveenv⼆、nand启动烧写Uboot:通过SD卡启动的u-boot for tiny210 将u-boot镜像写⼊nandflash在虚拟机下重启tftp sudo service tftpd-hpa restart开发板终端下执⾏下⾯的命令:[FriendlyLEG-TINY210]# tftp 21000000 tiny210-uboot.bin[FriendlyLEG-TINY210]# nand erase.chip[FriendlyLEG-TINY210]# nand write 21000000 0 3c1f4 (写⼊长度)内核的烧写位置是0x600000开始的区域,⽂件系统烧写位置为0xe00000开始的区域。
petalinux-build_-c_u-boot的编译流程_概述说明

petalinux-build -c u-boot的编译流程概述说明1. 引言1.1 概述本文旨在介绍petalinux-build -c u-boot命令的编译流程。
Petalinux是一款面向嵌入式Linux开发的工具,而U-Boot是一款应用于嵌入式系统的开源引导加载程序。
通过深入了解这两个工具,并对petalinux-build -c u-boot命令进行详细分析,我们可以更好地理解和掌握其编译流程。
1.2 文章结构本文主要分为五个部分:引言、编译流程概述、编译流程详解、注意事项和常见问题解答以及结论。
在引言中,我们将简要介绍文章的内容和目的。
接下来,在第二部分中,我们将概述Petalinux和U-Boot,并重点介绍petalinux-build -c u-boot命令的作用。
第三部分将详细解释编译流程,并包括准备工作、设置环境变量和构建U-Boot镜像等步骤。
在第四部分,我们将讨论常见错误和解决方法,提供编译优化技巧和建议,并指出其他注意事项。
最后,在结论部分,我们将对编译流程进行总结,并展望未来发展。
1.3 目的本文旨在帮助读者全面了解petalinux-build -c u-boot命令的编译流程。
通过讲解Petalinux和U-Boot的基本知识以及具体的编译步骤,读者可以深入了解如何正确地使用该命令,并解决在编译过程中可能遇到的问题。
同时,本文还将提供一些实用的编译优化技巧和建议,以帮助读者提高工作效率。
希望通过本文的阅读,读者能够更好地掌握petalinux-build -c u-boot命令的使用技巧,并在嵌入式Linux开发中取得更好的成果。
2. 编译流程概述:2.1 Petalinux简介:Petalinux是由Xilinx开发的一种嵌入式Linux开发工具套件,用于构建、定制和部署基于Xilinx处理器系统的嵌入式Linux系统。
它提供了一系列工具和文档,方便开发人员进行Linux镜像的配置、编译和调试。
uuboot 移植流程

uuboot 移植流程U-Boot 移植流程介绍U-Boot是一个开源的引导加载程序,常用于嵌入式系统中。
移植U-Boot可以将其适配到不同的硬件平台上,以满足特定需求。
本文将详细说明U-Boot移植的流程。
准备工作1.硬件选型:根据项目需求,选择适合的硬件平台。
2.获取源代码:从U-Boot官方网站或仓库下载最新版本的源代码。
3.安装交叉编译工具链:根据目标硬件平台的指令集架构,选择合适的交叉编译工具链,并进行安装。
4.了解目标硬件平台:熟悉目标硬件平台的架构、引导方式、存储器布局等相关信息。
移植流程1.配置编译环境:设置交叉编译工具链的环境变量,以确保正确编译U-Boot源代码。
2.配置U-Boot:修改U-Boot源代码中的配置文件,根据目标硬件平台的特性和需求进行相应配置。
–配置目标硬件平台的处理器类型、存储器布局等基本信息。
–配置启动方式,如通过网络(TFTP)或存储介质(SD卡、NAND Flash)等进行启动。
–配置启动流程,如引导加载程序的加载顺序、启动脚本等。
3.添加适配代码:根据目标硬件平台的需求,编写适配代码,包括引导加载程序和设备驱动等。
–引导加载程序:为目标硬件平台选择合适的程序入口点,配置启动参数,加载适配的设备驱动等。
–设备驱动:根据目标硬件平台的外设,编写相应的设备驱动代码,以支持外设的初始化和操作。
4.编译U-Boot:使用交叉编译工具链,编译修改后的U-Boot源代码。
–执行make clean清除之前的编译结果。
–执行make命令编译U-Boot源代码。
5.烧录和运行:将编译生成的U-Boot镜像烧录到目标硬件平台,并进行测试。
–根据目标硬件平台的烧录方式(串口、JTAG等),将U-Boot镜像烧录到目标设备。
–启动目标设备,观察U-Boot的启动信息是否正常输出,检查设备驱动是否正常加载。
6.调试和优化:根据实际情况,进行U-Boot的调试和性能优化。
–使用调试工具进行调试,如调试器、串口打印信息等。
uboot的常用命令及用法

uboot的常⽤命令及⽤法uboot是bootloader的⼀种,主要是⽤于引导内核启动.uboot除此功能外, 还带有很多其它功能. 功能是通过命令来调⽤.uboot的命令:help //列出当前uboot所有⽀持的命令help 命令 //查看指定命令的帮助reset //重启ubootbootm //⽤于启动内核⽤法: bootm 0x42000000 //从内存地址0x42000000启动内核, 启动前需把内核镜像uImage存放到指定的内存地址printenv //打印所有环境变量的值printenv 环境变量名 //查看指定的环境变量值常⽤环境变量:bootdelay // uboot启动后, 倒计时多少秒后⾃动执⾏环境变量bootcmd的语句bootcmd // 倒计时到0后,⾃动执⾏⾥⾯的语句bootargs // 是⽤于提供给内核的启动参数语句setenv //设置/修改/删除环境变量的值⽤法:setenv 环境变量名 //删除指定的环境变量setenv myargs "hello" //设置环境变量myargs=hello, 如果环境变量没有会创建出来,如果已存则会修改它的值saveenv //保存环境变量,环境变量修改过后必须执⾏此命令才可以保存起来,否则重启后环境变量就恢复了.loady //⽤于从uart线下载⽂件到板上内存⾥(loadb, loads, loadx基本⼀样) ⽤法:loady 0x40008000 //把下载的⽂件从内存地址0x40008000开始存放执⾏"loady 0x40008000"后, uboot就会进⼊等待状态,等着接收数据minicom具有通过uart传输⽂件的功能.按"ctrl+a", 松⼿后再按"s", 选择"ymodem", 在弹出的界⾯⾥按空格键选中要传的⽂件.md 内存地址 //⽤于查看内存地址上的值⽤法:md.b 0x40008000 100 //从内存地址0x40008000开始,查看0x100个字节并输出值md.w 0x40008000 100 //从内存地址0x40008000开始,查看0x100个16位值并输出值md.l 0x40008000 100 //从内存地址0x40008000开始,查看0x100个32位值并输出值mw //⽤于修改内存地址上的值⽤法:mw.b 0x40008000 0xab 100 //从内存地址0x40008000开始的0x100字节空间,设值为0xabmw.w 0x40008000 0xabcd 100 //从内存地址0x40008000开始的0x200字节空间,每16位值设为0xabcdmw.l 0x40008000 0xabcdef88 100 //从内存地址0x40008000开始的0x400字节空间,每32位值设为0xabcdef88 go //执⾏指定内存地址上的指令⽤法:go 0x40008000mmc // sd/mmc接⼝设备(sd卡, emmc)操作命令, 按扇区操作(每扇区512字节)⽤法:mmc read addr blk cnt //从mmc设备上的第blk个扇区开始,共读出cnt个扇区到内存地址addr上mmc write addr blk cnt //把内存地址addr上的数据写⼊mmc设备的第blk个扇区,共cnt个扇区⼤⼩mmc dev //⽤于当看当前的mmc设备是第⼏个mmc erase blk cnt //把mmc设备的第blk个扇区开始清零,共清除cnt个扇区⼤⼩ mmc part //列出当前mmc设备的分区信息mmc list //列出所有的mmc设备信息ext4ls //查看存储设备的ext2/3/4分区⾥的内容⽤法:ext4ls mmc 0:2 //查看第0个存储设备的第⼆个分区ext4load //从ext2/3/4分区⾥读出⽂件到指定的内存地址⽤法:ext4load mmc 0:2 0x40008000 /uImage //从第0个存储设备的第2个分区的根⽬录读出uImage⽂件到内存地址0x40008000 fatls //查看存储设备的fat分区⾥的内容⽤法:fatls mmc 0:1 //查看第0个存储设备的第1个分区(fat分区)fatload //从fat分区⾥读出⽂件到指定的内存地址⽤法:fatload mmc 0:1 0x40008000 /uImage //从第0个存储设备的第1个分区的根⽬录读出uImage⽂件到内存地址0x40008000fatwrite //把内存上的数据存储到fat分区的⼀个⽂件⾥⽤法:fatwrite mmc 0:1 0x40008000 /my.txt 0x35 //把内存地址0x40008000开始的0x35个字节数据写⼊到第0个设备的第1个分区⾥,⽂件名为my.txtrun //执⾏指定的环境变量⾥的语句⽤法:run bootcmd //执⾏环境变量bootcmd⾥的语句//如uboot上已驱动好⽹络设备并环境变设好IP及PC端IP,还可以使⽤以下命令:tftpboot 0x40008000 ⽂件名 // 通过⽹络下载⽂件到内存地址0x40008000, PC端需配置好tftp服务器nfs 0x40008000 pc端IP:/带路径的⽂件名 //pc端需配置好nfs服务器ping ip //检测⽹络是否通指令: bootmbootm ⽤于将内核镜像加载到内存的指定地址处例:bootm 0x82000000查看和修改环境变量指令常⽤环境变量列表bootdelay 执⾏⾃动启动(bootcmd中的命令)的等候秒数baudrate 串⼝控制台的波特率bootfile 默认的下载⽂件名bootargs 传递给Linux内核的启动参数bootcmd ⾃动启动时执⾏命令stdin 标准输⼊设备,⼀般是串⼝stdout 标准输出,⼀般是串⼝,也可是LCD(VGA)stderr 标准出错,⼀般是串⼝,也可是LCD(VGA)serverip TFTP服务器端的IP地址ipaddr 本地的IP地址ethaddr 以太⽹的MAC地址netmask 以太⽹的⽹络掩码gatewayip 以太⽹的⽹关指令: setenvname value第1个参数是环境变量的名称。
uboot讲义
1嵌入式Linux软件结构与分布一般情况下嵌入式Linux系统中的软件主要分为以下几部分:1)引导加载程序:其中包括内部ROM中的固化启动代码和BootLoader两部分。
内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导BootLoader。
有的芯片比较复杂,比如Omap3在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。
而S3C24x0则很简单,只有Norboot和Nandboot。
drive e rs。
2)Linux kernel和driv3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境及载体。
4)应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash存储器中,他们的分布一般如下:BootLoader(被挂载到根文件系统或者作为2在嵌入式Linux中BootBootL L o a d er的必要性Linux内核的启动除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:1.CPU寄存器的设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址;2.CPU模式:必须禁止中断(IRQs和FIQs);CPU必须SVC模式;3.Cache和MMU的设置:MMU必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有初始化过,根本无法在主存中运行程序,更不可能处在Linux内核启动环境中。
为了初始化CPU及其他外设,使得Linux内核可以在系统主存中运行,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
全志T3启动-uBoot+SylixOS
T3-Uboot开发笔记及SylixOS启动1.全志T3Uboot概述1.1.Brom阶段:全志SoC有一个非常具体的启动过程。
首先,它执行一个微小的片上Boot ROM(BROM),然后检查按钮的FEL模式,然后开始检查各种存储选项的有效的引导签名在正确的位置。
上电后,SoC开始从BROM所在的地址0xffff0000获取指令。
BROM分为两部分:第一部分(0xffff0000)是FEL模式,第二部分是eGON.BRM(位于0xffff4000)。
FEL:FEL是包含在Allwinner设备上的BootROM中的低级子例程。
它用于使用USB 的设备的初始编程和恢复。
一般来说,BROM首先检查SD卡(SD/MMC)启动可用性,其次再检查Nand Flash 是否可以启动,然后再检查SPI Nor Flash的启动可用性,如果都无法启动则进入FEL模式。
当程序初始化启动介质成功后,就从固定位置读入bootloader的Boot0到SRAM,然后跳到SRAM执行。
1.2.Bootloader阶段Bootloader是全志平台上从小系统一直沿用下来的内核加载器,在这里的主要职责是加载U-Boot到DRAM。
Bootloader分为两个部分,分别是Boot0和Boot1。
Boot0:初始化DRAM,加载Boot1到DRAM;Boot1:调频,加载U-Boot 到DRAM;为什么Bootloader要划分成Boot0和Boot1两个部分?因为在Bootloader阶段,使用的SRAM大小是32KB,除去C运行环境需要的栈空间,可用的空间在24KB左右,这点不足以载入整个Bootloader。
因此,需要将Bootloader划分成两个部分,尽可能将繁重的任务放在Boot1执行,这个情况类似于Linux系统中断执行环境的上半部和下半部。
1.boot0执行过程2.boot1的执行过程Boot1会进行一次系统调频,将CPU的频率调到用户在sys_config1.fex target段配置的boot_clock。
u-boot-2011.12移植
u-boot-2011.12移植by kongan90第一步配置编译环境1.1.下载源码ftp://ftp.denx.de/pub/u-boot/上面这个地址可以下载到最新的源代码,选择的是u-boot-2011.12.tar.bz2版本。
1.2.硬件环境mini2440早期的版本CPU:s3c2440SDRAM:64MBNor Flash:2MBNand Flash:64MB网卡:DM90001.3安装编译环境及解压源码并传回windowstar -zxvf 解压arm-linux-gcc-4.3.2gedit ~/.bashrc 最后一行增加export PATH=$PATH:/usr/local/arm/4.3.2/bin重启虚拟机登入查看arm-linux-gcc -v 看是否变成了所安装的版本号提示4.3.2说明安装生效了解压tar -jxvf u-boot-2011.12.tar.bz2,并把源码考回到windows下面,在windows下改代码还是会舒服些。
1.4 删减u-boot 文件(可不做)(1)删除arch 目录下除arm 目录以外的所有目录(2)删除arm/cpu 目录下除arm920tmulu 以外的所有目录(3)删除arch/arm/cpu/arm920t 目录下除s3c24x0 目录以外的所有目录(文件不要删)(4)删除arch/arm/include/asm 目录下除arch‐s3c24x0 外的所有arch‐xxxx 目录(文件不要删)(5)删除board 目录下除samsung 目录以外的所有目录(6)删除board/samsung 目录下除smdk2410 目录以外的所有目录(7)删除include/configs 目录下除smdk2410.h 文件以外的所有头文件。
1.5.配置开发板1.在“boards.cfg”中增加自己开发板选项。
进入到u-boot-2011.12目录下,cd u-boot-2011.12,然后打开“boards.cfg”文件,在“smdk2410.....”那一行下增加自己开发板的一行“mimi2440 arm arm920t - kongan s3c24x0”。
Uboot启动流程
Uboot启动流程(国嵌)开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。
看一下board/smdk2410/u-boot.lds那个链接脚本,能够明白目标程序的各部分链接顺序。
第一个要链接的是cpu/arm920t/start.o,那么U-Boot 的入口指令一定位于那个程序中。
下面分两时期介绍启动流程:第一时期1.cpu/arm920t/start.S那个汇编程序是U-Boot的入口程序,开头确实是复位向量的代码。
_start: b reset //复位向量ldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irq //中断向量ldr pc, _fiq //中断向量…/* the actual reset code */reset: //复位启动子程序/* 设置CPU为SVC32模式*/mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0/* 关闭看门狗*/…………relocate: /* 把U-Boot重新定位到RAM */adr r0, _start /* r0是代码的当前位置*/ldr r1, _TEXT_BASE /*_TEXT_BASE是RAM中的地址*/ cmp r0, r1 /* 比较r0和r1,判定当前是从Flash启动,依旧RAM */beq stack_setup /* 如果r0等于r1,跃过重定位代码*//* 预备重新定位代码*/ldr r2, _armboot_startldr r3, _bss_startsub r2, r3, r2 /* r2 得到armboot的大小*/add r2, r0, r2 /* r2 得到要复制代码的末尾地址*/copy_loop: /* 重新定位代码*/ldmia r0!, {r3-r10} /*从源地址[r0]复制*/stmia r1!, {r3-r10} /* 复制到目的地址[r1] */cmp r0, r2 /* 复制数据块直到源数据末尾地址[r2] */ble copy_loop/* 初始化堆栈等*/stack_setup:ldr r0, _TEXT_BASE /* 上面是128 KiB重定位的u-boot */sub r0, r0, #CFG_MALLOC_LEN /* 向下是内存分配空间*/sub r0, r0, #CFG_GBL_DATA_SIZE /* 然后是bdinfo结构体地址空间*/#ifdef CONFIG_USE_IRQsub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsub sp, r0, #12 /* 为abort-stack预留3个字*/clear_bss:ldr r0, _bss_start /* 找到bss段起始地址*/ldr r1, _bss_end /* bss段末尾地址*/mov r2, #0x00000000 /* 清零*/clbss_l:str r2, [r0]/* bss段地址空间清零循环... */add r0, r0, #4cmp r0, r1bne clbss_l/* 跳转到start_armboot函数入口,_start_armboot字储存函数入口指针*/ldr pc, _start_armboot_start_armboot: .word start_armboot //start_armboot函数在lib_arm /board.c中实现第二时期2.lib_arm/board.cstart_armboot是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
U-BOOT环境变量实现(2008-12-03 13:57:14) 标签:杂谈
1.相关文件
common/env_common.c 供u-boot调用的通用函数接口,它们隐藏了env的不同实现方式,比如dataflash, epprom, flash等
common/env_dataflash.c env 存储在dataflash中的实现
common/env_epprom.c env 存储在epprom中的实现
common/env_flash.c env 存储在flash中的实现
common/env_nand.c env 存储在nand中的实现
common/env_nvedit.c 实现u-boot对环境变量的操作命令
environment.c 环境变量以及一些宏定义
env如果存储在Flash中还需要Flash的支持。 2.数据结构
env 在 u-boot 中通常有两种存在方式,在永久性存储介质中( Flash NVRAM等 )在SDRAM,可以配置不使用 env 的永久存储方式,但这不常用。u-boot 在启动的时候会将存储在永久性存储介质中的 env 重新定位到 RAM 中,这样可以快速访问,同时可以通过saveenv 将 RAM 中的 env 保存到永久性存储介质中。
在include/environment.h中定义了表示env的数据结构
typedef struct environment_s { unsigned long crc; #ifdef CFG_REDUNDAND_ENVIRONMENT unsigned char flags; #endif unsigned char data[ENV_SIZE]; } env_t; 关于以上结构的说明: crc是u-boot在保存env 的时候加上去的校验头,在第一次启动时一般 crc校验会出错,这很正常,因为这时 Flash中的数据无效。 data字段保存实际的环境变量。u-boot 的 env 按 name=value”\0”的方式存储,在所有env的最后以”\0\0”表示整个 env 的结束。新的name=value对总是被添加到 env 数据块的末尾,当删除一个name=value对时,后面的环境变量将前移,对一个已经存在的环境变量的修改实际上先删除再插入。 env 可以保存在 u-boot 的 TEXT 段中,这样 env 就可以同 u-boot 一同加载入RAM中,这种方法没有测试过。 上文提到u-boot会将 env 从 flash 等存储设备重定位到 RAM 中,在 env 的不同实现版本( env_xxx.c )中定义了 env_ptr, 它指向 env 在RAM中的位置。u-boot在重定位 env后对环境变量的操作都是针对 env_ptr。 env_t 中除了数据之外还包含校验头,u-boot 把env_t 的数据指针有保存在了另外一个地方,这就是 gd_t 结构( 不同平台有不同的 gd_t 结构 ),这里以ARM为例仅列出和 env 相关的部分 typedef struct global_data { … unsigned long env_off; unsigned long env_addr; unsigned long env_valid … } gd_t; gd_t.env_addr 即指向 env_ptr->data。
3.ENV 的初始化 start_armboot : ( lib_arm/board.c ) *env_init : env_xxx.c( xxx = nand | flash | epprom … ) env_relocate : env_common.c *env_relocate_spec : env_xxx.c( xxx=nand | flash | eporom… ) 3.1env_init
实现 env 的第一次初始化,对于nand env (非embedded方式): Env_nand.c : env_init gd->env_addr = (ulong)&default_environment[0]; //先使gd->env_addr指向默认的环境变量 gd->env_valid = 1;// env 有效位置1 3.2 env_relocate
#ifdefine ENV_IS_EMBEDDED …(略) #else env_ptr = (env_t *)malloc (CFG_ENV_SIZE); #endif if( gd->env_valid == 0) // 在 Env_annd.c : env_init 中已经将 gd->env_valid 置1 { … } else env_relocate_spec ();// 调用具体的 env_relocate_spec 函数 gd->env_addr = (ulong)&(env_ptr->data);// 最终完成将环境变量搬移到内存 这里涉及到两个和环境变量有关的宏 ENV_IS_EMBEDDED : env 是否存在于 u-boot TEXT 段中 CFG_ENV_SIZE : env 块的大小 实际上还需要几个宏来控制u-boot 对环境变量的处理 CFG_ENV_IS_IN_NAND : env 块是否存在于Nand Flash 中 CFG_ENV_OFFSET : env 块在 Flash 中偏移地址
3.3*env_relocate_spec
这里仅分析 Nand Flash 的 env_relocate_spec 实现 如果未设置 CFG_ENV_OFFSET_REDUND,env_relocate_spec的实现如下 : void env_relocate_spec (void) { #if !defined(ENV_IS_EMBEDDED) ulong total; int ret;
total = CFG_ENV_SIZE; ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr); if (ret || total != CFG_ENV_SIZE) return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc) return use_default(); #endif } 上面的代码很清楚的表明了 env_relocate_spec 的意图,调用 nand_read 将环境变量从 CFG_ENV_OFFSET 处读出,环境变量的大小为 CFG_ENV_SIZE 注意 CFG_ENV_OFFSET和 CFG_ENV_SIZE 要和 Nand Flash 的块/页边界对齐。读出数据后再调用crc32 对env_ptr->data 进行校验并与保存在 env_ptr->crc 的校验码对比,看数据是否出错,从这里也可以看出在系统第一次启动时,Nand Flash 里面没有存储任何环境变量,crc校验肯定回出错,当我们保存环境变量后,接下来再启动板子u-boot就不会再报crc32出错 了。 4. ENV 的保存
由上问的论述得知, env 将从永久性存储介质中搬到RAM里面,以后对env 的操作,比如修改环境变量的值,删除环境变量的值都是对这个 env 在RAM中的拷贝进行操作,由于RAM的特性,下次启动时所做的修改将全部消失,u-boot提供了将env 写回 永久性存储介质的命令支持 : saveenv,不同版本的 env ( nand flash, flash … )实现方式不同,以Nand Flash 的实现(未定义CFG_ENV_OFFSET_REDUND)为例 Env_nand.c : saveenv int saveenv(void) { ulong total; int ret = 0;
puts ("Erasing Nand..."); if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE)) return 1;
puts ("Writing to Nand... "); total = CFG_ENV_SIZE; ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr); if (ret || total != CFG_ENV_SIZE) return 1;
puts ("done\n"); return ret; } Nand Flash 的 saveenv 命令实现很简单,调用nand_erase 和nand_write进行Nand Flash的 erase, write。nand_write/erase使用的是u-boot 的nand驱动框架,我在做开发的过程中使用的是nand_legacy驱动,所以可以把nand_erase和nand_write改成nand_legacy_erase和nand_legacy_rw就可实现nand_legacy驱动的保存环境变量版本。
U-boot基础知识之环境变量篇 6.4.3 U-Boot的环境变量 有点类似Shell,U-Boot也使用环境变量。可以通过printenv命令查看环境变量的设置。