Chinaunix首页 | 论坛 | 博客
  • 博客访问: 166727
  • 博文数量: 38
  • 博客积分: 705
  • 博客等级: 中士
  • 技术积分: 372
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-30 15:24
文章分类

全部博文(38)

文章存档

2016年(2)

2014年(1)

2013年(2)

2012年(33)

分类:

2012-06-19 20:34:08

原文地址:Uboot命令使用 作者:自语的骆驼

A:Uboot的命令功能


Uboot在硬件初始化完成之后 调用 main_loop()进入一个无限循环,等待用户输入命令

当用户输入命令之后,首先将调用run_command()函数, 然后调用find_cmd()函数把用户从终端输入的命令进行比较,当find_cmd()返回值 不等于0,则将调用命令处理函数


find_cmd()函数将从系统默认的命令表中查询一个匹配的命令,
命令表(定义在board/fads/u-boot.lds中)
_uboot_cmd_start = .;
.u_boot_cmd : {*(.u_boot_cmd)}
_uboot_cmd_end = .;




u_boot_cmd中是定义的命令(定义在command.h中)
#define Struct_Section __attribute__ ((unused,section(".uboot_cmd")))
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t  __u_boot_cmd_##nameStruc_Section {#name, maxargs, rep , cmd, usage}


command.c中定义了和命令本身相关的命令处理程序,而cmd_***文件则是某一类型的命令处理程序,这些命令处理程序构成了U-boot命令处理功能(Uboot命令以16进制的格式显示)


B:命令使用
1.信息显示
bdinfo(缩写bdi), 打印开发的信息
coninfo(缩写conin),打印串口设备信息
flinfo(缩写fli),打印当前系统flash信息
iminfo(缩写imi),打印映像头部信息
help,打印帮助信息
2.内存控制命令
base,打印和设置内存中的地址偏移量
crc32计算校验和,用于计算一段内存空间的检验和,当该命令带3个参数表示把计算出来的校验和写到第三个参数所在的存储单元中
cmp,内存比较,用于比较两端内存内容是否相同
cp,数据拷贝,可以进行烧录flash,也可以进行内存中的数据拷贝
md,内存显示
erase,擦除flash中的内容,每次flash烧录前必须先对flash进行擦除
protect 打开和关闭写保护,防止flash重要区域不被误写
3.运行控制命令
bootm-加载和启动映像
bootm用于加载并启动使用mkimage工具(tools中)打包过的映像
bootm用于将内核映像加载到指定的地址,如果需要还要进行解压映像
然后给内核传递不同的内核参数,最后启动内核
bootm可以有2个参数,第1个参数为内核映像的地址,第二个为可选参数,即initrd映像地址
当采用ramdisk作为根文件系统时需要使用bootm第二个参数,当需要加载initrd时,uboot把内核映像加载到指定地址,然后把Ramdisk映像的大小和地址告诉内核
go-启动映像
go命令时另外一种启动映像的命令,go将直接跳转到某个地址然后执行放在该地址处的内核映像
go命令不设置环境变量,也不能解析映像


4.数据下载命令
tftpboot通过tftp协议下载映像
需配置dhcp服务器和tftp服务器,tftpboot命令之会到指定的目录下载映像
即:/etc/xinetd.d/tftp下server_args中配置的目录下,


5.环境变量设置命令
printenv(pri)打印当前环境变量
setenv-设置环境变量
当setenv有一个参数时,就是删除该环境变量,当有两个参数则把第二个参数作为环境变量
设置完要使用saveenv保存环境变量
如果想讲某个环境变量设置为多条语句,则需使用双引号
ep:
setenv bootcmd “tftpboot 0x100000000 uImage; bootm 0x10000000”


C、U-Boot环境变量

当uboot启动时,首先将调用env_init()进行初始化,从配置的环境变量所在地址CFG_ENV_ADDR
(该地址在environment.h中定义,被定义成CFG_FLASH_BASE + CFG_ENV_OFFSET)读取指定大小
的数据来计算循环冗余校验值CRC,并计算出CRC值是否和存放在环境变量区开头的CRC值相等,若相等,则证明数据没有被破坏,因此将把保存在FLASH上的地址作为环境变量地址(gd->env_addr设置为offsetof(env_t,data))


默认的环境变量设置在 default_environment

unchar default_environment[] = {
#ifdef CONFIG_BOOTARGS
"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#ifdef CONFIG_BOOTCOMMAND
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
#ifdef CONFIG_NFSBOOTCOMMAND
"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
...
}
从上面可以看出,一个环境变量的设置取决于响应的宏是否已经被定义,例如只有定义的宏CONFIG_BOOTARGS才会定义环境变量”bootargs“


环境变量设置分为动态设置(通过刚才的宏)与静态设置(通过setenv)


重要的环境变量:
1.bootcmd
  环境变量用于设置启动时自动加载的命令序列,但该环境变量只有在设置了CONFIG_BOOTDELAY时才会生效,实际上 main_loop()函数只有在CONFIG_BOOTDELAY被定义且大于0时,才会对”bootcmd“进行解析
2.bootargs
bootargs可以设置内核启动参数,即用于设置传递给内核的参数
内核启动时,将对这些启动参数进行处理,即拷贝到相应的内存地址处
lib_arm目录下的armlinux.c文件中的函数 do_bootm_linux()将对启动参数进行分析
必须定义了CONFIG_CMDLINE_TAG时才会对命令进行分析
首先 调用commandline=getenv("bootargs")获得系统设置的命令行参数
调用 setup_commandline_tag()对内核命令参数进行处理
,在setup_commandline_tag()判断命令行的有效性,并拷贝到全局变量params中
params = (struct tag *)bd->bi_boot_params;
而响应的bi_boot_params是在板级对应的文件中初始化的,
gd->bd->bi_bot_params=0x10000100
这里指定的地址必须与操作系统内核指定的内核地址一致
ep:
arch/arm/mach-omap/innovator.c
MACHINE_START(INNOVATOR, "TI-Innovator/OMAP1510")
MAINTAINER("Monta Visa Software, Inc")
BOOT_MEM(0x100000000, 0xe0000000, 0xe0000000)
BOOT_PARAMS(0X10000010)  //uboot中的bi_bot_params 地址要与这里一致
FIXUP(fixup_innovator)
MAPIO(innovator_map_io)
INITIRQ(innovator_init_irq)
MACHINE_END
阅读(1315) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~