uboot cmd机制
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也有环境变量。
《uboot环境变量:详谈bootcmd和bootargs》
《uboot环境变量:详谈bootcmd和bootargs》1.uboot中的环境变量bootdelay:执⾏⾃动启动的等候秒数baudrate:串⼝控制台的波特率netmask:以太⽹接⼝的掩码ethaddr:以太⽹卡的⽹卡物理地址bootfile:缺省的下载⽂件bootargs:传递给内核的启动参数bootcmd:⾃动启动时执⾏的命令serverip:服务器端的ip地址ipaddr:本地ip 地址stdin:标准输⼊设备stdout:标准输出设备stderr:标准出错设备 以上是⼀些基本的环境变量。
uboot中⼀般会有⼀些缺省的环境变量。
在启动uboot后会将参数放在特定的FLASH区域,之后由kernel去获取解析。
还有另⼀种⽅法设置环境变量就是在uboot启动后进⼊命令⾏模式,设置环境变量,然后执⾏saveenv后,会将设置的环境变量保存到特定区域的FLASH中,由kernel去获取解析。
其中bootargs和bootcmd相对⽐较重要。
2.bootargs解析root: ⽬前很多新的开发板都是使⽤FLASH作为存储。
因为很多都直接使⽤MTD驱动程序。
MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的⽀持、更好的管理和基于扇区的擦除和读写操作的更好的接⼝。
Linux 下的 MTD驱动程序接⼝被划分为两类模块:⽤户模块和硬件模块。
有两个流⾏的⽤户模块可启⽤对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供对闪存的原始字符访问,⽽ MTD_BLOCK 将闪存设计为可以在上⾯创建⽂件系统的常规块设备(象 IDE 磁盘)。
与MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),⽽与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。
由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的⽂件系统。
uboot下执行U_BOOT_CMD定义的命令
uboot下执行U_BOOT_CMD定义的命令今天研究了一下uboot中怎么用do_run()函数来执行定义好的一些命令,发现其实也挺简单的,关键是得把do_run函数的几个参数吃透,这几个参数都是由uboot commmod 的cmd_tbl_s结构体决定的,U_BOOT_CMD的宏定义也取决于它,如下:#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}struct cmd_tbl_s {char *name; /* Command Name */int maxargs; /* maximum number of arguments */ int repeatable; /* autorepeat allowed? *//* Implementation function */int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short) */#ifdef CONFIG_SYS_LONGHELPchar *help; /* Help message (long) */#endif#ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);#endif}对比两者后很容易就明白了怎样去定义一个uboot下的命令。
接下来看看do_run函数的定义(在../boot/common/main.c 下):#if defined(CONFIG_CMD_RUN)int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){int i;if (argc < 2) { //参数个数小于2则提示重新输入cmd_usage(cmdtp);return 1;}for (i=1; i<argc; ++i) {char *arg;if ((arg = getenv (argv[i])) == NULL) {printf ("## Error: \"%s\" not defined\n", argv[i]);return 1;}#ifndef CONFIG_SYS_HUSH_PARSERif (run_command (arg, flag) == -1){ //调用run_command函数,先查找命令,然后执行命令return 1;}#elseif (parse_string_outer(arg,FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0){return 1;}#endif}return 0;}其中第一个参数cmd_tbl_t * cmdtp为Command Table,即命令表参数,该结构体的定义在common.h下,一般设为NULL。
如何在uboot中增加用户自定义的命令
(".u_boot_list"))属性声明的变量都将被存放在".u_boot_list"段中,并且即使该变量没有在代码中显式的使用
编译器也不产生警告信息。“##”与“#”都是预编译操作符,“##”有字符串连接的功能,“#”表示后
面紧接着的是一个字符串.
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,
count = simple_strtoul(argv[3], NULL, 16);
if (count == 0) { puts ("Zero length ???\n"); return 1;
}
#ifndef CONFIG_SYS_NO_FLASH /* check if we are copying to Flash */ if ( (addr2info(dest) != NULL)
return 1;
Project Name –如何在 uboot 中增加自定义命令
© Bean huo
Page 3 of 7
addr = simple_strtoul(argv[1], NULL, 16); addr += base_address;
dest = simple_strtoul(argv[2], NULL, 16); dest += base_address;
0x1c common/libcommon.o _u_boot_list_2_cmd_2_bootvx
0x1c common/libcommon.o _u_boot_list_2_cmd_2_cmp
0x1c common/libcommon.o _u_boot_list_2_cmd_2_coninfo
uboot笔记uboot命令分析+实现
uboot笔记uboot命令分析+实现uboot笔记:uboot命令分析+实现Ubootuboot命令分析+实现先贴⼀个重要结构,位于uboot/include/command.h,这个结构代表每个uboot命令struct cmd_tbl_s {char *name; /* Command Name */int maxargs; /* maximum number of arguments*/int repeatable;/* autorepeat allowed? *//* Implementation function */int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short)简短⽤法信息*/#ifdef CFG_LONGHELPchar *help; /* Help message (long) 长的帮助信息*/#endif#ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */ int (*complete)(intargc, char *argv[], charlast_char, intmaxv, char *cmdv[]); #endif};typedefstruct cmd_tbl_s cmd_tbl_t;============================================================uboot的第⼀阶段:硬件相关初始化0.reset执⾏arm920t/start.s 过程如下1.设置cpu svc管理模式2.关看门狗中断,mmu等3.设置时钟,sdram,外部总线4.代码重定位,搬运代码,从flash到sdram5.设置栈,bss段清零, bss⽤于未初始化的全局变量和静态变量6.ldr pc, _start_armboot即进⼊uboot启动的第⼆阶段,调⽤c函数start_armboot()从start_armboot开始经过⼀系列外设初始化⽐如falsh_initnand_init...最后循环调⽤mian_loop()main_loop主要流程{1. ⽣成环境变量mtdparts, 调⽤mtdparts_init2. 在启动过程中若⽆空格键按下则boot_zImage,即run_command(getenv("bootcmd"),0)有空格键按下则run_command("menu",0)3. shell过程,读取⽤户的输⼊并执⾏相应的命令{从控制台获得命令,保存在全局变量comsole_buffer中解析命令⾏字符串,分割命令与参数,最后执⾏run_command(...); }}也就是说在mian_loop中,是处理环境变量和控制台⼈机交互,mian_loop调⽤readline ()读取命令⾏到console_buffer,再把console_buffer复制到lastcommand中去,还要设置flag,最后调⽤run_command (lastcommand, flag)函数,run_command (lastcommand, flag)函数中,⾸先定义cmd_tbl_t *cmdtp,再解析命令⾏。
uboot常用的命令
Uboot常用的命令一、概述Uboot是一款开源的引导加载程序,广泛应用于嵌入式系统。
它负责在开机时初始化硬件、加载操作系统以及其他系统组件,并提供一系列命令供用户进行系统配置和维护。
本文将介绍Uboot常用的命令,帮助读者更好地了解和使用Uboot。
二、Uboot常用命令下面是Uboot常用的命令:1. help命令格式:help [command]该命令用于显示Uboot支持的命令列表。
如果指定了具体的命令名称,则会显示该命令的详细帮助信息。
2. printenv命令格式:printenv [variable]该命令用于打印当前环境变量的值。
如果指定了具体的变量名称,则只会打印该变量的值。
3. setenv命令格式:setenv variable value该命令用于设置环境变量的值。
variable是要设置的变量名称,value是要设置的值。
4. saveenv命令格式:saveenv该命令用于保存当前环境变量到非易失性存储器中,以便下次开机时可以加载。
5. boot命令格式:boot该命令用于启动系统。
在执行该命令之前,需要设置好bootargs和bootcmd等环境变量,以确保系统能够正确启动。
6. md命令格式:md address [#of objects]该命令用于从指定的内存地址读取数据并显示。
address是内存地址,#of objects是要读取的对象数目,默认为1。
7. mw命令格式:mw address value [# of objects]该命令用于向指定的内存地址写入数据。
address是内存地址,value是要写入的值,#of objects是要写入的对象数目,默认为1。
8. ping命令格式:ping [ipaddr]该命令用于向指定的IP地址发送ICMP Echo请求,以测试网络连接的可用性。
如果未指定IP地址,则会使用默认的目标地址。
9. tftpboot命令格式:tftpboot [loadAddress] [filename]该命令用于通过TFTP协议从指定的服务器下载文件并加载到指定的内存地址。
uboot的bootcmd bootargs参数详解
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
mtdparts的格式如下:
mtdparts=[;
:= :[,]
:= [@offset][][ro]
:= unique id used in mapping driver/device
:= standard linux memsize OR "-" to denote all remaining space
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
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命令解释与运行分析
uboot命令解释与运行分析题记: 省略200字这一回来分析一下uboot中命令行的解释, 所以我们直接从main_loop开始分析.1. 从汇编阶段进入c阶段的第一个函数是start_xxx, 如/lib_unicore/board.c中的start_unicoreboot. 前半部分调用了若干初始化函数来进行部分硬件的初始化, 并设置一下环境. 这里不是我们本回要讨论的所以一一跳过. 在start_xxx的最后调用了main_loop(), 而且还是被一个死循环死死圈住了;2. 现在我们已经进入了这个圈套那么只能往里钻了. common/main.c文件中的main_loop().上面代码主要是对自启动部分的描述, 其中命令执行部分是在run_command中进行的, 这个等在后文分析. 如果我们没有bootcmd 或者在延时中被打断, 那么代码会继续向下执行3.read_line()读取到命令行后会调用common/main.c文件中的run_command().现在是分析run_command()的时候了,不管是从环境变量还是终端获得命令,都是由run_command()来处理的.中场休息,下面要进入处理cmdbuf的循环中了, 长征马上开始以;分割. 忽略'\;'for(inquotes = 0, sep = str;*sep; sep++){if((*sep=='\'')&&(*(sep-1)!='\\'))inquotes=!inquotes;if(!inquotes &&(*sep ==';')&&( sep != str)&&(*(sep-1)!='\\'))break;}//如果上面for循环找到一条以';'结束的命令, 那么sep指向命令末尾token = str;if(*sep){str = sep + 1;*sep ='\0';}elsestr = sep;process_macros (token, finaltoken);if((argc = parse_line (finaltoken, argv))== 0){rc =-1;4.就此打断一下, 我们要分析一下find_cmd了, 不能再跳过了. find_cmd()在.u_boot_cmd段中寻找该命令的cmd_tbl_t结构, 找到后返回该结构. 该命令的结构是通过定义在include/command.h中的宏定义U_BOOT_CMD登记进.u_boot_cmd段中的.5. 刚才我们在长征的半路翻越了一座雪山, 现在继续回到while循环中if(cmdtp->cmd == do_bootd){if(flag & CMD_FLAG_BOOTD){puts("'bootd' recursion detected\n");rc =-1;continue;}else{flag |= CMD_FLAG_BOOTD;}}#endif//长征马上结束, 胜利就在眼前! 调用结构体中注册的cmd函数, 何时注册的呢? 上面不远处介绍的U_BOOT_CMD!if((cmdtp->cmd)(cmdtp, flag, argc, argv)!= 0){ rc =-1;}repeatable &= cmdtp->repeatable;if(had_ctrlc ())return-1;}。
UBOOT——命令体系
UBOOT——命令体系 uboot中命令⾏的实现原理: uboot中设备的输⼊输出是通过串⼝来作为标准输⼊输出的,我们可以通过securecrt软件来接受设备从串⼝发出的信息,也可以通过securecrt软件写⼊串⼝向设备中发送命令;所以在设备调试的时候通常都是通过打印串⼝信息调试的; 第⼀步:在主函中设置⼀个死循环⽤来接受处理命令,并打印信息;uboot中这个函数是main_loop函数; main_loop函数所做的具体的事情有: 1:读取sercurecrt命令⾏中发送的串⼝信息,并把读取的字符串信息保存在⼀个局部变量字符串数组lastcommand中:函数为 len = readline (CFG_PROMPT); 2:执⾏lastcommand字符串数组中保存的命令rc = run_command (lastcommand, flag); 第⼆步:在readline函数中所要做的事情就是把从命令⾏中接收到的信息进⾏初步处理,把处理好以后的字符串放⼊全局变量console_buffer中; readline函数所做的具体事情: 1:输出x210 # 2:调⽤cread_line函数从securecrt中命令⾏中读取命令,并进⾏初步的处理; 分析⼀下cread_line函数中所做的事情: 1:ichar = getcmd_getch();这个函数是从串⼝中读取信息;如果读取到'\n'或者'\r'的话表⽰输⼊完成; 2:之后的代码就是处理键盘的特殊字符详细解释可以看⼀下这篇博客 /uid-30031530-id-5152127.html 第三步:rc = run_command (lastcommand, flag)函数中要进⼀步处理lastcommand中的字符串 1:调⽤process_macros函数处理字符串中的转义字符; 2:调⽤parse_line函数统计argc、赋值argv 3:调⽤find_cmd命令查找相应命令返回命令的结构体指针; 4:(cmdtp->cmd) (cmdtp, flag, argc, argv)以函数指针的⽅式来执⾏命令函数;接下来⼀个⼀个函数进⾏分析,⾸先当start_armboot函数会循环在⼀个main_loop函数中,控制台界⾯实际是在这个函数中输⼊命令、解析命令、查找、执⾏命令⼀下是删除条件编译以后的main_loop函数void main_loop (void){#ifndef CFG_HUSH_PARSER static char lastcommand[CFG_CBSIZE] = { 0, }; //定义⼀个字符数组来存储所有读取到的命令int len;int rc = 1;int flag;#endif/** 下⾯这段代码是执⾏bootdelay倒计时,**/#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)char *s;int bootdelay;#endif#ifdef CFG_HUSH_PARSERu_boot_hush_start ();#endif//extern void act8937_charging_loop();//act8937_charging_loop(); /* Evan Tan, 2010-12-13 */printf("Enter into Normal mode\n");#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)/** ⾸先从环境变量中读取bootdelay的值,如果读取成功则把从环境变量中读取到的bootdealy* 的值复制给bootdelay,如果不成功则从default_env数组中读取bootdelay并赋值* abortboot函数的作⽤就是执⾏倒计时,执⾏完倒计时以后执⾏bootcmd命令,启动linux内核。
bootcmd及bootargs命令
U-boot的环境变量值得注意的有两个:bootcmd 和bootargs。
u-bootcmdbootcmd是自动启动时默认执行的一些命令,因此可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为经常使用的那种参数。
u-bootargsbootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。
A. root用来指定rootfs的位置,常见的情况有:root=/dev/ram rwroot=/dev/mtdx rwroot=/dev/mtdblockx rwroot=/dev/mtdblock/x rwroot=31:0x上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。
此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
root=/dev/nfs在文件系统为基于nfs的文件系统的时候使用。
当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。
B. rootfstype这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.C. consoleconsole=tty 使用虚拟串口终端设备.console=ttyS[,options] 使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶位(从来没有看过使用过),n是指的bits。
D. memmem=xxM 指定内存的大小,不是必须的E. ramdisk_sizeramdisk_size=xxxxx 推荐上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关的描述。
uboot分析之bootm
uboot分析之bootmbootm命令执⾏过程中调⽤了bootm_start函数,这个函数⽐较重要,所以先分析它。
mon/cmd_bootm.cCpp代码1. static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])2. {3. void *os_hdr;4. int ret;5. memset ((void *)&images, 0, sizeof (images));//images是⼀个bootm_headers_t类型的全局变量。
见下⾯的分析。
6. images.verify = getenv_yesno ("verify");//从环境变量中检查是否要对镜像的数据(不是镜像头)进⾏校验。
7. bootm_start_lmb();//不做任何有意义的⼯作,除了定义# define lmb_reserve(lmb, base, size)8. /* get kernel image header, start address and length */寻找可⽤的内核镜像,见下⾯的分析。
主要根据传⼊的参数检查镜像的合法性并获取信息。
9. os_hdr = boot_get_kernel (cmdtp, flag, argc, argv,10. &images, &images.os.image_start, &images.os.image_len);//返回指向内存中镜像头的指针11. if (images.os.image_len == 0) {12. puts ("ERROR: can't get kernel image!\n");13. return 1;14. }15. /* get image parameters */16. switch (genimg_get_format (os_hdr)) {//根据镜像魔数获取镜像类型17. case IMAGE_FORMAT_LEGACY:18. images.os.type = image_get_type (os_hdr);//镜像类型19. p = image_get_comp (os_hdr);//压缩类型20. images.os.os = image_get_os (os_hdr);//操作系统类型21. images.os.end = image_get_image_end (os_hdr);//当前镜像的尾地址22. images.os.load = image_get_load (os_hdr);//镜像数据的载⼊地址23. break;24. default:25. puts ("ERROR: unknown image format type!\n");26. return 1;27. }28. /* find kernel entry point */29. if (images.legacy_hdr_valid) {//如果镜像已经通过验证30. images.ep = image_get_ep (&images.legacy_hdr_os_copy);//获取⼊⼝地址,填充images.ep 。
uboot-配置文件
uboot-配置⽂件uboot配置⽂件⼀般在configs下⾯,但是这⾥的配置⽂件⾥⾯的内容很少,⼀般相关的c和h配置⽂件在:board/freescare(⼚家)/imx6ullevk(扳⼦)/imx6ullevk.c(板⼦c⽂件)头⽂件在:include/configs/mx6ullevk.h(板⼦头⽂件)其中头⽂件引⼊了⼀个很重要的⽂件(mon.h),这⾥⾯存放了这⼀系列的板⼦的所有通⽤配置⽂件,可以修改改⽂件进⾏配置。
DDR在uboot中的board/freescare(⼚家)/imx6ullevk(扳⼦)/imx6ullevk.c(板⼦c⽂件)的统计⽬录下存在⼀个imximage.cfg⽂件,该⽂件⽤于校准DDR,在这⾥进⾏ddr的校准测试。
环境变量如果我们没有配置环境变量,那么在系统启动的时候,他会条⽤⾃⼰的环境变量,这个环境变量的配置⽂件在:include/env_default.h中定义。
⽐如说⾥⾯的:#ifdef CONFIG_BOOTCOMMAND “bootcmd=” CONFIG_BOOTCOMMAND “\0”这⾥的CONFIG_BOOTCOMMAND在之前配置的.h⽂件中有定义(include/configs/mx6ullevk.h(板⼦头⽂件))。
bootcmdbootcmd主要是⽤来启动内核的,⾥⾯存放了⼀些列命令,⽤于uboot启动内核。
可以直接在include/configs/mx6ullevk.h(板⼦头⽂件)的头⽂件中通过修改CONFIG_BOOTCOMMAND直接将bootcmd进⾏写死bootargsbootargs会将其值传递给内核。
在头⽂件中CONFIG_EXTRA_ENV_SETTINGS下⾯运⾏了⼀个"run mmcargs的脚本,在该脚本中定义了bootargs: "mmcargs=setenv console,bootargs console={baudrate} "将其展开:bootargs console = ttymxc0,115200,root=/dev/mmcblk1p2root设置的是根⽂件系统。
uboot下的命令行
uboot下的命令⾏1.典型嵌⼊式linux系统启动过程:嵌⼊式系统上电后先执⾏uboot、然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就⽆⽤了)2.uboot必须解决哪些问题1、⾃⾝可开机直接启动(1)⼀般的SoC都⽀持多种启动⽅式,譬如SD卡启动、NorFlash启动、NandFlash启动等·····uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot(2)uboot必须进⾏和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。
uboot中第⼀阶段的start.S⽂件中具体处理了这⼀块。
2、能够引导操作系统内核启动并给内核传参(1)uboot的终极⽬标就是启动内核。
(2)linux内核在设计的时候,设计为可以被传参。
也就是说我们可以在uboot中事先给linux内核准备⼀些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被⽤来指导linux内核的启动过程。
3、能提供系统部署功能(1)uboot必须能够被⼈借助⽽完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载⼯作。
(2)裸机教程中刷机(ARM裸机第三部分)就是利⽤uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。
4、能进⾏soc级和板级硬件管理(1)uboot中实现了⼀部分硬件的控制能⼒(uboot中初始化了⼀部分硬件),因为uboot为了完成⼀些任务必须让这些硬件⼯作。
譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显⽰进度条就必须能驱动LCD,譬如uboot能够通过串⼝提供操作界⾯就必须驱动串⼝。
uboot 代码运行流程
uboot 代码运行流程U-Boot代码运行流程U-Boot(Universal Bootloader)是一个开源的引导加载程序,广泛应用于嵌入式系统中。
它负责在系统上电后初始化硬件并加载操作系统内核,是系统启动的重要一环。
下面将从U-Boot代码的运行流程方面进行介绍。
1. 启动阶段当系统上电后,处理器会从预定义的存储器地址开始运行代码。
U-Boot的启动代码通常存放在ROM中,处理器会从ROM的起始地址开始执行。
启动代码负责初始化处理器和一些外设,然后跳转到U-Boot的入口点。
2. 入口点U-Boot的入口点是指U-Boot的main()函数。
在启动代码的最后,会调用main()函数,从而进入U-Boot的主循环。
U-Boot的主循环负责处理用户输入的命令,并根据命令执行相应的操作。
3. 硬件初始化在main()函数中,首先会进行硬件的初始化工作。
这包括初始化串口、初始化存储器控制器、初始化网络接口等。
硬件初始化的目的是为了确保系统能够正常运行,并为后续的操作做好准备。
4. 系统启动硬件初始化完成后,U-Boot会尝试从存储设备(如闪存、SD卡)中加载操作系统内核镜像。
U-Boot会根据预定义的启动命令(例如bootcmd)来确定从哪个设备加载内核镜像,并执行相应的加载操作。
加载完成后,U-Boot会将控制权交给操作系统内核,进入操作系统的启动阶段。
5. 用户交互一般情况下,U-Boot会在系统启动后进入命令行界面,等待用户输入命令。
用户可以通过串口、网络等方式与U-Boot进行交互,执行各种操作,例如烧写固件、修改配置等。
U-Boot提供了丰富的命令集,可以满足不同的需求。
6. 系统重启当用户输入重启命令或系统发生异常时,U-Boot会执行系统重启操作。
重启操作包括重新初始化硬件、重新加载内核镜像等步骤,以重新启动系统。
U-Boot会将控制权交给重新加载的内核,然后进入内核的启动流程。
总结:U-Boot代码的运行流程包括启动阶段、入口点、硬件初始化、系统启动、用户交互和系统重启等几个关键步骤。
[uboot](第五章)uboot流程——uboot启动流程
[uboot](第五章)uboot流程——uboot启动流程/ooonebook/article/details/53070065以下例⼦都以project X项⽬tiny210(s5pv210平台,armv7)为例[uboot] uboot流程系列:建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例⼦了解⼀下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运⾏位置,功能。
建议可以和《[uboot] (番外篇)global_data介绍》和《[uboot] (番外篇)uboot relocation介绍》结合起来看。
=================================================================================⼀、uboot说明1、uboot要做的事情CPU初始刚上电的状态。
需要⼩⼼的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。
其次,就是要根据硬件资源进⾏板级的初始化,代码重定向等等。
最后,就是进⼊命令⾏状态,等待处理命令。
在armv7架构的uboot,主要需要做如下事情arch级的初始化关闭中断,设置svc模式禁⽤MMU、TLB关键寄存器的设置,包括时钟、看门狗的寄存器板级的初始化堆栈环境的设置代码重定向之前的板级初始化,包括串⼝、定时器、环境变量、I2C\SPI等等的初始化进⾏代码重定向代码重定向之后的板级初始化,包括板级代码中定义的初始化操作、emmc、nand flash、⽹络、中断等等的初始化。
进⼊命令⾏状态,等待终端输⼊命令以及对命令进⾏处理上述⼯作,也就是uboot流程的核⼼。
2、疑问在前⾯的⽂章中虽然已经说明了,在spl的阶段中已经对arch级进⾏了初始化了,为什么uboot⾥⾯还要对arch再初始化⼀遍?回答:spl对于启动uboot来说并不是必须的,在某些情况下,上电之后uboot可能在ROM上或者flash上开始执⾏⽽并没有使⽤spl。
u-boot 添加命令
u-boot 启动大致流程u-boot:Start.s ->start_armboot ()<./lib_arm/board.c> ->main_loop ()<./common/main.c>main_loop()会调用abortboot (bootdelay)判断在delay time内有没有键按下,并给出prompt“Hit any key to stop autoboot”,若没有键按下则run_command (s, 0)(s为默认的bootcmd)。
这里默认的bootcmd需要根据内核的位置设置,若bootcmd未赋值,Uboot就会一直等待。
如果敲入bootm,也会启动kernel,并且传入参数。
如果使用tftp从pc中下载kernel并启动也是可以的。
添加u-boot命令,也就是在进入main_loop()函数后,在等待的时间里可以识别的命令步骤:1、添加命令标志CONFIG_CMD_XXXXX(XXXXX为自己的定义的命令)在/include/config_cmd_all.h 和/include/config_cmd_default.h中都添加2、编写代码在u-boot/common目录下,建立一个cmd_XXXXX.c文件,自己定义的命令,具体实现命令的函数3、修改一下u-boot/common/Makefile文件在合适的位置添加ifdef CONFIG_CMD_XXXXXCOBJS-$(CONFIG_CMD_XXXXX) += cmd_XXXXX.oendif4、回到u-boot顶层目录> make Super2440_config # 调入自己板子配置> make # 完成make后,就得到u-boot.bin文件5、把得到的u-boot.bin文件烧入板子NOR FLASH,启动板子进入u-boot命令行,输入help,就能看到XXXXX命令被列出来。
uboot相关命令及用法
uboot相关命令及⽤法进⼊uboot时,在命令⾏上敲“?” ,回车就会打印出在uboot⾥可⽤的命令:#?- alias for 'help'base - print or set address offsetboot - 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 memorybootvx - Boot vxWorks from an ELF imagecheckcrash- check ATAGS from crash and dump to filechpart - change active partitioncmp - memory comparecp - memory copycrc32 - checksum calculationecho - echo args to consoleefuse - opt efuse dataenv - environment handling commandsexit - exit scriptext4load- load binary file from a Ext2 filesystemext4ls - list files in a directory (default /)false - do nothing, unsuccessfullyfastboot- fastbootfatinfo - print information about filesystemfatload - load binary file from a dos filesystemfatls - list files in a directory (default /)fatwrite- write file into a dos filesystemgo - start application at address 'addr'gpio - input/set/clear/toggle gpio pinshelp - print command description/usagei2c - I2C sub-systemjtag - jtag systemloop - infinite loop on address rangemd - memory displaymm - memory modify (auto-incrementing address)mmc - MMC sub systemmmcinfo - display MMC infomtdparts- define flash/nand partitionsmtest - simple RAM read/write testmw - memory write (fill)nand - NAND sub-systemnboot - boot from NAND devicenm - memory modify (constant address)nu7 - nu7 sub systempmic - pmic interfaceprintenv- print environment variablesreset - Perform RESET of the CPUrun - run commands in an environment variablesaveenv - save environment variables to persistent storagesetenv - set environment variablesshowvar - print local hushshell variablessource - run script from memorytest - minimal test like /bin/shtrue - do nothing, successfullyubi - ubi commandsubifsload- load file from an UBIFS filesystemubifsls - list files in a directoryubifsmount- mount UBIFS volumeubifsumount- unmount UBIFS volumeusb - USB sub-systemusbboot - boot from USB deviceversion - print monitor, compiler and linker version我们想要查看其中某个命令的⽤法时,在命令⾏上敲⼊“命令名?”即可,如“mmc ?”:#mmc ?mmc - MMC sub systemUsage:mmc read addr blk# cntmmc write addr blk# cntmmc erase blk# cntmmc rescanmmc part - lists available partition on current mmc devicemmc dev [dev] [part] - show or set current mmc device [partition]mmc list - lists available devicesmmc read⽤来读取mmc内容到内存,mmc write⽤来写⼊内存内容到mmc中具体⽤法,mmc read <device num> addr blk# cnt [partition]mmc write <device num> addr blk# cnt [partition]mmc listdevice num是mmc的设备号,可以通过mmc list查询addr是内存地址blk# 是mmc内的块号cnt 块数⽬使⽤范例:mmc write 2 0x90000000 0x600 0x10把内存0x90000000开始,长度为16x512⼤⼩的数据,写⼊到第2个mmc设备块偏移位置为0x600处mmc read 2 0x90000000 0x600 0x10把第⼆个mmc设备块偏移为0x600处开始,长度为16x512⼤⼩的数据,读出到内存0x90000000处从外置mmc卡load uImage⽂件:#mmc listSD/MMC: 0SD/MMC: 1#mmc dev 0mmc0 is current device#fatload mmc 0:10x82007fc0 uImage#pri#run default_bootargs只设pmic vdd:pmic vdd 1250000设置bootargs#setenv bootargs console=ttyS0,115200 root=/dev/mmcblk1p2 rw rootwait gpu=384M mem=792M video=nusmartfb:${resolution}-${dispformat} 706_hw_ver=2 init=/init quiet no_console_suspend设置default_bootargs#setenv default_bootargs console=ttyS0,115200 root=/dev/mmcblk1p2 rw rootwait gpu=384M mem=792M video=nusmartfb:${resolution}-${dispformat} 706_hw_ver=2 init=/init quiet no_console_suspend #ext4load mmc 1:20x82007fc0 uImage#bootm。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uboot cmd机制
U-Boot Cmd机制
U-Boot是一种开源的引导加载程序,常用于嵌入式系统中。
它提供了一系列的命令行指令(Cmd)来管理和控制系统的启动和运行。
本文将介绍U-Boot Cmd机制,并探讨其在嵌入式系统中的应用。
一、U-Boot Cmd机制的基本原理
U-Boot的Cmd机制是通过在源代码中定义一系列的命令函数来实现的。
每个命令函数对应一个特定的命令,当用户在U-Boot的命令行界面输入相应的命令时,U-Boot会调用对应的命令函数来执行相应的操作。
Cmd机制的实现依赖于两个关键的数据结构:cmd_tbl_t和cmd_tbl_list。
cmd_tbl_t是一个结构体,用于存储每个命令的相关信息,如命令名称、命令函数等。
cmd_tbl_list则是一个数组,用于存储所有命令的cmd_tbl_t结构体。
在U-Boot的初始化过程中,所有的命令函数都会被注册到cmd_tbl_list数组中。
当用户输入一个命令时,U-Boot会遍历cmd_tbl_list数组,在数组中找到对应的命令函数,并调用该函数执行相应的操作。
二、U-Boot Cmd机制的使用方法
U-Boot的命令行界面提供了丰富的命令,用于管理和控制嵌入式系统的启动和运行。
以下是一些常用的U-Boot命令:
1. boot:用于启动系统。
可以指定从哪个设备启动、加载内核镜像和设备树等。
2. printenv:用于打印环境变量。
可以查看当前系统的环境变量设置。
3. setenv:用于设置环境变量。
可以修改系统的环境变量值。
4. saveenv:用于保存环境变量。
将当前环境变量保存到存储设备中,以便下次启动时恢复。
5. ping:用于测试网络连接。
可以向指定的IP地址发送网络请求,测试网络的连通性。
6. tftpboot:用于通过TFTP协议下载文件。
可以从TFTP服务器下载文件到内存中。
7. mmc:用于操作SD卡。
可以查看SD卡的分区、格式化SD卡、读写SD卡中的文件等。
8. fatload:用于从FAT文件系统中加载文件。
可以将指定文件加载到内存中。
以上只是U-Boot命令中的一小部分,U-Boot提供了更多的命令用于系统管理和调试。
用户可以根据实际需求选择合适的命令进行操作。
三、U-Boot Cmd机制的应用场景
U-Boot Cmd机制的灵活性使其在嵌入式系统中有着广泛的应用。
以下是U-Boot Cmd机制的一些常见应用场景:
1. 系统启动配置:通过设置U-Boot的环境变量,可以灵活配置系统的启动方式和参数。
例如,可以设置从哪个设备启动、加载哪个内核镜像等。
2. 文件系统操作:U-Boot提供了一系列的命令用于对文件系统进行操作。
用户可以在U-Boot命令行界面上进行文件的读写、格式化等操作。
3. 网络调试:U-Boot支持网络调试功能,用户可以通过网络命令进行网络连接测试、网络文件传输等操作。
4. 系统调试和维护:U-Boot提供了一系列的调试命令,用于系统的调试和维护。
用户可以通过这些命令查看系统信息、调试硬件等。
四、U-Boot Cmd机制的优势和不足
U-Boot Cmd机制的优势在于其灵活性和可扩展性。
开发人员可以
根据实际需求自定义命令函数,并注册到U-Boot中。
这使得U-Boot可以根据不同的应用场景进行定制,满足各种需求。
然而,U-Boot Cmd机制也存在一些不足之处。
首先,U-Boot的命令行界面相对简陋,不够直观和友好。
其次,对于复杂的操作,用户需要记住一系列的命令和参数,容易出错。
此外,U-Boot的Cmd机制对于一些高级功能的支持不够完善,无法满足一些特定的需求。
总结:
U-Boot Cmd机制是U-Boot引导加载程序的核心功能之一,它提供了一系列的命令行指令,用于管理和控制嵌入式系统的启动和运行。
通过合理使用U-Boot的Cmd机制,开发人员可以实现系统的灵活配置、文件系统操作、网络调试以及系统的调试和维护。
尽管U-Boot Cmd机制存在一些不足,但其优势和应用广泛性使其成为嵌入式系统开发中不可或缺的一部分。