『壹』 uboot201407如何查看从哪启动SD卡还是EMMC
Arm板系统文件一般有三个——bootloader(uboot)、kernel(uImage)及根文件系统(rootfs)。在arm板上电后,按uboot->kernel->rootfs的顺序依次启动。由于开发板上有多种存储介质,三个文件可以放在任何可以存储的介质上,因此也就导致文件的多种启动方式。本文就来讨论,以上三个文件对应不通存放位置的不同启动配置。一般开发板上会有flash(Nor or NAND),mmc,emmc,sd卡等。系统文件可以烧写在其中的任意一种上,因此也就对应不通的启动。在开发过程中,有时经常需要改动内核,或者修改应用程序,如果每次都修改后都重新烧写到板上的存储介质,会比较麻烦。因此,为方便调试,uImage和rootfs还可以从网络启动,即nfs启动。但uboot只能从板上介质启动。启动过程其实是先将要启动的文件从存储位置拷贝到内存空间,再在内存中运行。因此所谓不同位置启动,也就是从不同位置拷贝而已。下面我们以开发板启动为例,分别介绍三个文件从不同位置启动的过程方法。我使用的开发板上有emmc和两个sd卡。我们按照启动顺序,依次介绍。首先是uboot启动。Uboot是三个系统文件中第一个启动的,对它的拷贝工作由cpu中的固件决定。固件中支持从几个位置拷贝uboot,它就能存放在几个位置上。至于每次启动具体从其中的哪里开始,硬件拨码开关决定,对应拨码在开发板手册上能查到。启动之前,先将uboot的二进制文件拷贝到对应介质。有两种不同方法烧写,如下:1. uboot二进制文件拷贝到emmc,是通过芯片供应商的下载工具软件烧写完成;2. 拷贝到sd卡是在linux下,通过dd命令完成的。烧写完成后,将启动拨码拨到对应位置即可启动uboot。然后介绍kernel文件(uImange)和rootfs的启动。如上所述,uImage和rootfs可以从emmc、sd卡或nfs拷贝到内核启动。具体的启动位置由uboot中的参数传递的内容决定。这些参数的内容在uboot中有写死的值,也可以在uboot启动阶段进入到命令输入界面,修改这些参数的值,来改变启动位置。(作者:围补)进入uboot命令界面后,输入如下一段命令,修改启动参数,并重启。setenv loadaddr 0x10800000 setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200' setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,[email protected],if=RGB24 ip=dhcp' setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm' setenv bootcmd 'run bootcmd_mmc' saveenv run bootcmd 命令输入完后,重启开发板,即可按照上述命令中设置的参数来启动系统。下面我们来分析一下uboot阶段输入的启动参数的意义,以便读者自己修改相关内容,让板子从自己需要的位置启动。首先介绍几个命令。是在上面看到最多的setenv命令,该命令使用来设置或删除某个环境变量的。当setenv后面只带一个参数,该参数必须为已有的变量名,输入命令回车后该变量即被删除;当setenv后面有多个参数,将把其后第一个参数作为环境变量,后面其他参数作为该变量的值或内容。第二个要解释的命令mmc。在uboot命令界面中敲入mmc,回车,能够看到其多个用法:Usage: mmc read addr blk# cnt mmc write addr blk# cnt mmc erase blk# cnt mmc rescan mmc part – lists available partition on currentmmc device mmc dev [dev] [part] – show or set current mmcdevice [partition] mmc bootpart [dev] [part] – show or set bootpartition mmc list – lists available devices 解释一下其中几个用法:mmc read addr blk# cnt 用来将硬盘(emmc/sd)中的内容读取到内存中。其中addr指内存中的目标位置起始地址,blk#指被拷贝内容起始存储块的块号,cnt指要被拷贝的块数。一般每个块的大小为512byte。mmc dev [dev] [part] – show or set current mmc device [partition] 显示或设置当前设备。命令mmc dev即为显示当前是哪个device;mmc dev #意为设置“#”为当前设备。第三个命令saveenv是保存环境变量的意思。环境变量设置后,使用该指令保存,下次重启时会按照上次保存的设置启动,就不用再次设置了。最后,run命令比较明显,“运行”的意思。一般加在某内容为可执行命令的变量前。再来说明一下变量。在上述参数设置命令中,参数bootargs和bootcmd是uboot的参数,其功能和名称不能被改变,其他都是用户自定义的变量,可以改变其名称。其中bootargs代表由uboot传给内核的参数;bootcmd是uboot启动时,系统自动加载的命令序列。如果设置了启动参数后,想让系统下次自动按照本次设置的方式启动,则一定要把拷贝和启动内核的语句设置为bootcmd的值,否则下次启动无法自动加载并启动内核。(作者围补)介绍完重要的命令及uboot环境变量后,我们再来看上面的启动参数设置命令行:setenv loadaddr 0x10800000 setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200' setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,[email protected],if=RGB24 ip=dhcp' setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm' setenv bootcmd 'run bootcmd_mmc' saveenv run bootcmd 按照上面对命令和参数的讲解,做一些变量的替换之后,可以看到,此处只做了两件事,一是设置环境变量bootargs的值,二是设置bootcmd的值,并保存。其中bootargs的值传递给内核,用来初始化一些设备和启动rootfs;bootcmd的值用来启动内核,即自动加载的命令序列。(最后一句run bootcmd是启动,不再是设置命令了。)对上述命令中,采用如此多自定义变量的原因是,有些调试工具命令行输入不能过长,因此用中间自定义变量缩短一次性输入的命令行长度。我们将不必要的自定义变量做替换掉,然后来分析其内容。setenv bootargs console=ttymxc0,115200root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,[email protected],if=RGB24ip=dhcp setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm' saveenv run bootcmd 将自定义变量替代掉后,能看到,参数设置其实就是做了对两个系统环境变量赋值的工作。下面具体分析各变量值得内容。对bootargs的赋值,对要是跟rootfs启动相关。内容是一个很大的字符串,不同项之间由空格隔开,也可以把由空格隔开的多项看做是多个参数。第一项是console=ttymxc0,115200是选择操作台,并设置波特率。中间几项root=/dev/mmcblk0p1 rootwait rw,是对rootfs启动位置设置root=/dev/mmcblk0p1是指从设备mmcblk0的p1分区挂载rootfs。那么mmcblk0到底是哪个设备呢?由于文件系统的挂载是在kernel启动后进行的,而内核启动后会安装linux的分配方式给现有设备分配名称,因此可对应区分设备。我使用的开发板上,emmc即为mmcblk0设备,sd安装挂载顺序依次后排。如果多个卡槽在系统启动前都插上了sd卡,系统会安装sd卡槽所在接口号依次分配设备名称号。比如,两个sd卡槽,slot2和slot3(对应总线号),只插一个sd开始,无论在哪个槽都是mmcblk1;但两个都插上sd时,在slot2中的是mmcblk1,slot3中的则是mmcblk2。Ok,至此,从哪个设备挂载rootfs已经很清楚了。后面两个参数,rw是声明启动权限,即以读写方式启动;rootwait是指等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪是就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。最后的几个参数,video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,[email protected],if=RGB24 ip=dhcp,是做一些设备初始化的,主要是对视频设备和网络,对不需要视频设备的嵌入式系统可以不设置此项,ip也可以单独设置。然后是第二个环境变量bootcmd的设置,主要跟kernel启动相关。setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'设置bootcmd内容为命令序列,用用单引号包围,命令间由分号分隔。按照上面对mmc命令的讲解,第一个命令mmc dev 1,意思是将dev 1设置为当前设备。这里就是uImage启动(拷贝)的位置。在我使用的开发板上,dev 1指放在卡槽slot2中的sd卡。此处由于linux内核没有启动,设备名称不能按照linux分配方式确定。在我使用的开发板上,dev 2是放在卡槽slot3中的sd卡,dev3是emmc。对此句做相应修改,即可更改内核启动位置。mmc read 0x10800000 0x800 0x2000这句大家也应该可以明白意思了,即将存储设备上从块号0x800开始的0x2000个存储块的东西拷贝到内存0x10800000开始的空间内。bootm也是uboot命令,用于加载uboot能辨认的操作系统映像。
『贰』 source insight怎么查看uboot代码
对于嵌入式学习经常就要和Uboot和内核打交道,Source Insight便是我认为非常好的源码查看工具。对于Uboot和内核源码的查看,它有着非常好的索引方式,且拥有非常方便的快捷键操作方式。对于庞大的源码树最好就是建立一个工程来管理。但当你查找一个关键词的时候,会出现许多与之相关的文件,不同的CPU和单板会有着同名的文件,很明显并不是所有的文件都是我们需要查看的。那么如何建立一个“节约”且合适的工程呢?在这里分享下我的经验。一、建立工程文件夹 最好建立一个自己的管理Source Insight所有工程文件夹(例如在D:\建立文件夹 D:\SourInProject),然后分别创建单独的工程文件夹。在这里我们建的是Uboot-2010.03工程,那么就建立一个文件夹名为:Uboot-2010.03Pro,在里面放置Uboot-2010.03源码包,和一个准备放置Source Insight所创建的Uboot-2010.03工程包SourInPro。这样就很清晰,源码和工程包单独放在一个命名为Uboot-2010.03Pro下,即不同的工程都带有一个源码包和一个创建后的工程包。二、如何创建工程(1)、首先打开Source Insight软件,配置好软件所认识的文件后缀,点击菜单栏上Options->Document Options,在Document Type下拉列表中,选择C Source File,然后在右边File filter:文本框中添加一些重要文件后缀;*.S;*.lds;*defconfig;Makefile等(否则点击Add Tree添加目录树时,一些重要文件不被加入到工程,则要手动一个个加入,当然最简单的办法就是加个 ;*.* 就好)。然后再点击菜单栏上的Project->New Project,在弹出的New Project对话窗口,New project name:(工程名)在这填Uboot-2010.03,Where do you want to store the project data files?(你想把你的工程文件存放在哪里),在这我们填在上一步创建的D:\SourInProject\Uboot-2010.03Pro\SourInPro。然后一路OK,出现一个名为:Add and Remove Project Files对话框,下面我们就针对此对话窗口操作;
『叁』 查看uboot版本请指点!
源码顶层目录的makefile的前几行VERSION = 1PATCHLEVEL = 2SUBLEVEL = 0EXTRAVERSION =U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)这个是1.2.0
『肆』 华硕路由Uboot是什么意思,是硬件版本的意思么如果不是,那路由的硬件版本在哪里看
Uboot是启动代码,一般是用C或者汇编写的。。 就好比PC机子上的BIOS。。 你的硬件是由软件操纵的,uboot就是告诉设备从哪里启动软件 至于你说的硬件版本,就是操纵路由的软件版本。。和Uboot不是同一个概念。。
『伍』 uboot的2010.03是哪个版本
就是2010.03版,以前是用想1.x.x-来表示版本,后面就用年月来表示了,你可以到官网上看所有的版本ftp:(和谐)//ftp.denx.de/pub/u-boot/
『陆』 如何从uboot中推算路由器flash烧写地址
首先从uboot中得到flash分区的基地址一、找到uboot编译生成的bootstrap.map或者u-boot.map文件,找到下面这句,.text 0x000000009f000000 0x3520其中 0x9f000000 就是flash分区的基地址;二、查看uboot的源代码,例如qca9531芯片,其flash分区的基地址就定义在下面这个头文件中;u-boot\include\configs\board953x.h/* NOR Flash start address */#define CFG_FLASH_BASE 0x9f000000查看路由器flash分区信息~ # cat /proc/mtd dev: size erasesize namemtd0: 00040000 00010000 "u-boot"mtd1: 00010000 00010000 "u-boot-env"mtd2: 00630000 00010000 "rootfs"mtd3: 00160000 00010000 "uImage"mtd4: 00010000 00010000 "mib0"mtd5: 00010000 00010000 "ART"~ # cat /proc/partitions major minor #blocks name 31 0 256 mtdblock0 31 1 64 mtdblock1 31 2 6336 mtdblock2 31 3 1408 mtdblock3 31 4 64 mtdblock4 31 5 64 mtdblock5开始计算各自模块的flash地址及烧写命令烧写uboot:tftp 0x80060000 u-boot.binerase 0x9f000000 +0x40000cp.b 0x80060000 0x9f000000 0x40000烧写jffs2tftp 0x80060000 ap143-jffs2erase 0x9f050000 +0x630000cp.b 0x80060000 0x9f050000 0x630000烧写vmlinuxtftp 0x80060000 vmlinux.lzma.uImageerase 0x9f680000 +0x160000cp.b 0x80060000 0x9f680000 0x160000烧写art:tftp 0x80060000 art.binerase 0x9f7f0000 +0x10000cp.b 0x80060000 0x9f7f0000 0x10000
『柒』 如何显示Uboot版本和Kernel版本
显示Uboot版本(环境变量的定义特定平台可能会有差别) :1.uboot代码中增加版本的环境变量:setenv("ubootversion","XXXXXXXXXXXXX");2.system.prop 中最后添加:ubootenv.var.ubootversion=3.应用层调用:String ubootVersion= SystemProperties.get("ubootenv.var.ubootversion");4.应用层显示就不用说啦。 显示Kernel版本:内核版本显示可以改build.prop下的ro.build.user=tvro.build.host=ubunturo.build.version.release=2.3.4 这几个系统属性
『捌』 如何查看uboot编译哪一个board目录
U-Boot编译命令 对于mini2440开发板,编译U-Boot需要执行如下的命令:$ make mini2440_config$ make all 使用上面的命令编译U-Boot,编译生成的所有文件都保存在源代码目录中。为了保持源代码目录的干净,可以使用如下命令将编译生成的文件输出到一个外部目录,而不是在源代码目录中,下面的2种方法都将编译生成的文件输出到 /tmp/build目录:$ export BUILD_DIR=/tmp/build$ make mini2440_config$ make all或$ make O=/tmp/build mini2440_config (注意是字母O,而不是数字0)$ make all 为了简化分析过程,方便读者理解,这里主要针对第一种编译方式(目标输出到源代码所在目录)进行分析。2.1.2 U-Boot配置、编译、连接过程 U-Boot开头有一些跟主机软硬件环境相关的代码,在每次执行make命令时这些代码都被执行一次。 1. U-Boot 配置过程(1)定义主机系统架构HOSTARCH := $(shell uname -m | \ sed -e s/i.86/i386/ \ -e s/sun4u/sparc64/ \ -e s/arm.*/arm/ \ -e s/sa110/arm/ \ -e s/powerpc/ppc/ \ -e s/ppc64/ppc/ \ -e s/macppc/ppc/) “sed –e”表示后面跟的是一串命令脚本,而表达式“s/abc/def/”表示要从标准输入中,查找到内容为“abc”的,然后替换成“def”。其中“abc”表达式用可以使用“.”作为通配符。 命令“uname –m”将输出主机CPU的体系架构类型。作者的电脑使用Intel Core2系列的CPU,因此“uname –m”输出“i686”。 “i686”可以匹配命令“sed -e s/i.86/i386/”中的“i.86”,因此在作者的机器上执行Makefile,HOSTARCH将被设置成“i386” 。(2)定义主机操作系统类型HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ sed -e 's/\(cygwin\).*/cygwin/') “uname –s”输出主机内核名字,作者使用Linux发行版Ubuntu9.10,因此“uname –s”结果是“Linux”。“tr '[:upper:]' '[:lower:]'”作用是将标准输入中的所有大写字母转换为响应的小写字母。因此执行结果是将HOSTOS 设置为“linux”。(3)定义执行shell脚本的shell# Set shell to bash if possible, otherwise fall back to shSHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi; fi) "$$BASH"的作用实质上是生成了字符串“$BASH”(前一个$号的作用是指明第二个$是普通的字符)。若执行当前Makefile的shell中定义了“$BASH”环境变量,且文件“$BASH”是可执行文件,则SHELL的值为“$BASH”。否则,若“/bin/bash”是可执行文件,则SHELL值为“/bin/bash”。若以上两条都不成立,则将“sh”赋值给SHELL变量。 由于作者的机器安装了bash shell,且shell默认环境变量中定义了“$BASH”,因此SHELL 被设置为$BASH 。(4)设定编译输出目录ifdef Oifeq ("$(origin O)", "command line")BUILD_DIR := $(O)endifendif 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,若variable在命令行中定义过,则origin函数返回值为"command line"。假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,而BUILD_DIR被设置为“/tmp/build”。ifneq ($(BUILD_DIR),)saved-output := $(BUILD_DIR) # Attempt to create a output directory.$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) 若${BUILD_DIR}表示的目录没有定义,则创建该目录。# Verify if it was successful.BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))endif # ifneq ($(BUILD_DIR),) 若$(BUILD_DIR)为空,则将其赋值为当前目录路径(源代码目录)。并检查$(BUILD_DIR)目录是否存在。OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))SRCTREE := $(CURDIR)TOPDIR := $(SRCTREE)LNDIR := $(OBJTREE)… …MKCONFIG := $(SRCTREE)/mkconfig… …ifneq ($(OBJTREE),$(SRCTREE))obj := $(OBJTREE)/src := $(SRCTREE)/elseobj :=src :=endif CURDIR变量指示Make当前的工作目录,由于当前Make在U-Boot顶层目录执行Makefile,因此CURDIR此时就是U-Boot顶层目录。 执行完上面的代码后, SRCTREE,src变量就是U-Boot代码顶层目录,而OBJTREE,obj变量就是输出目录,若没有定义BUILD_DIR环境变量,则SRCTREE,src变量与OBJTREE,obj变量都是U-Boot源代码目录。而MKCONFIG则表示U-Boot根目录下的mkconfig脚本。2. make mini2440_config命令执行过程 下面分析命令“make mini2440_config”执行过程,为了简化分析过程这里主要分析将编译目标输出到源代码目录的情况。mini2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0 其中的依赖“unconfig”定义如下:unconfig: @rm -f $(obj)include/config.h $(obj)include/config.mk \ $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \ $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep 其中“@”的作用是执行该命令时不在shell显示。“obj”变量就是编译输出的目录,因此“unconfig”的作用就是清除上次执行make *_config命令生成的配置文件(如include/config.h,include/config.mk等)。 $(MKCONFIG)在上面指定为“$(SRCTREE)/mkconfig”。$(@:_config=)为将传进来的所有参数中的_config替换为空(其中“@”指规则的目标文件名,在这里就是“mini2440_config ”。$(text:patternA=patternB),这样的语法表示把text变量每一个元素中结尾的patternA的文本替换为patternB,然后输出) 。因此$(@:_config=)的作用就是将mini2440_config中的_config去掉,得到mini2440。 因此“@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0”实际上就是执行了如下命令:./mkconfig mini2440 arm arm920t mini2440 samsung s3c24x0 即将“mini2440 arm arm920t mini2440 samsung s3c24x0”作为参数传递给当前目录下的mkconfig脚本执行。 在mkconfig脚本中给出了mkconfig的用法:# Parameters: Target Architecture CPU Board [VENDOR] [SOC] 因此传递给mkconfig的参数的意义分别是:mini2440:Target(目标板型号)arm:Architecture (目标板的CPU架构)arm920t:CPU (具体使用的CPU型号)mini2440:Boardsamsung:VENDOR(生产厂家名)s3c24x0:SOC