Uboot命令使用
发布时间:2020-12-15 18:44:54 所属栏目:百科 来源:网络整理
导读:A:Uboot的命令功能 Uboot在硬件初始化完成之后 调用? main_loop() 进入一个无限循环,等待用户输入命令 当用户输入命令之后,首先将调用 run_command() 函数, 然后调用find_cmd()函数把用户从终端输入的命令进 行比较, 当find_cmd()返回值 不等于0,则将
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,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 " " #endif #ifdef CONFIG_BOOTCOMMAND "bootcmd=" CONFIG_BOOTCOMMAND " " #endif #ifdef CONFIG_NFSBOOTCOMMAND "nfsboot=" CONFIG_NFSBOOTCOMMAND " " #endif #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) "bootdelay=" MK_STR(CONFIG_BOOTDELAY) " " #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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |