Uboot之hush方式解析用户命令.doc_第1页
Uboot之hush方式解析用户命令.doc_第2页
Uboot之hush方式解析用户命令.doc_第3页
Uboot之hush方式解析用户命令.doc_第4页
Uboot之hush方式解析用户命令.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

uboot 命令解析流程简析uboot正常启动后,会调用main_loop(void)函数,进入main_loop()之后,如果在规定的时间(CONFIG_BOOTDELAY)内,没有检查到任何按键事件的发生,就会去加载OS,并启动系统,比如把linux内核压缩镜像从nand flash中读到sdram ,然后执行它。如果在CONFIG_BOOTDELAY时间内,用户按下键盘上的任意一个按键,uboot就会进入与用户交互的状态。如果用户在配置文件中定义了CONFIG_SYS_HUSH_PARSER,就会通过parse_file_outer(),去接收并解析用户命令,否则进入一个for(;)循环中,通过readline (CONFIG_SYS_PROMPT)接收用户命令,然后调用run_command(cmd,flag)去解析并执行命令。代码如下: void main_loop(void) .#ifdef CONFIG_SYS_HUSH_PARSERparse_file_outer();/* This point is never reached */for (;);#elsefor (;)#ifdef CONFIG_BOOT_RETRY_TIMEif (rc = 0) /* Saw enough of a valid command to* restart the timeout.*/reset_cmd_timeout();#endiflen = readline (CONFIG_SYS_PROMPT);printf(after readline:%dn,len);flag = 0; /* assume no special flags for now */if (len 0)strcpy (lastcommand, console_buffer);else if (len = 0)flag |= CMD_FLAG_REPEAT;#ifdef CONFIG_BOOT_RETRY_TIMEelse if (len = -2) /* -2 means timed out, retry autoboot*/puts (nTimed out waiting for commandn);# ifdef CONFIG_RESET_TO_RETRY/* Reinit board to run initialization code again */do_reset (NULL, 0, 0, NULL);# elsereturn; /* retry autoboot */# endif#endifif (len = -1)puts (n);elserc = run_command (lastcommand, flag);.如果定义了CONFIG_SYS_HUSH_PARSER,命令接收和解析讲采用busybox 中的hush(对应hush.c)工具来实现,与uboot原始的命令解析方法相比,该工具更加智能。这里主要讲uboot中基于hush的命令解析流程。不过hush的实现太过复杂 ,鉴于自己水平太次,只是简单追踪下流程。当在配置文件中定义了CONFIG_SYS_HUSH_PARSER,main_loop会调用parse_file_outer(),进入hush,然后里面是一大堆和hush相关的机制,暂时不做分析,最终会调用到hush中的run_pipe_real(struct pipe *pi),在该函数中经过一些列解析 ,最终会调用到对应的命令执行函数,代码如下:static run_pipe_real(struct pipe *pi).rcode = (cmdtp-cmd)(cmdtp, flag,child-argc-i,&child-argvi);if ( !cmdtp-repeatable )flag_repeat = 0;.cmdtp 是对应命令的结构指针,cmd就是该命令对应的执行函数指针。在uboot中,对所有的命令,有一个cmd_tbl_t的结构,定义如下:struct cmd_tbl_schar *name; /* Command Name */int maxargs; /* maximum number of arguments */int repeatable; /* autorepeat allowed? */int (*cmd)(struct cmd_tbl_s *, int, int, char *); /* Implementation function */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;typedef struct cmd_tbl_s cmd_tbl_t;#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) cmd_tbl_t _u_boot_cmd_#name Struct_Section = #name, maxargs, rep, cmd, usage对于uboot支持的每一个命令,是通过U_BOOT_CMD宏定义的,他定义了该命令对应的名称name,支持的最大参数rep,重复次数,实现函数cmd,以及输入help命令时,显示的帮助信息usage。例如,在cmd_nand中,定义nand命令的方法如下:U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,NAND sub-system,info - show available NAND devicesnnand device dev - show or set current devicennand read - addr off|partition sizennand write - addr off|partition sizen read/write size bytes starting at offset offn to/from memory address addr, skipping bad blocks.nnand erase clean off size - erase size bytes fromn offset off (entire device if not specified)n#if defined(ENABLE_CMD_NAND_YAFFS)nand read.yaffs1 is not provide temporarily!nnand write.yaffs1 addr off size - write the size byte yaffs image startingn at offset off from memory address addr (.yaffs1 for 512+16 NAND)n#endifnand bad - show bad blocksnnand dump.oob off - dump pagennand scrub - really clean NAND erasing bad blocks (UNSAFE)nnand markbad off . - mark bad block(s) at offset (UNSAFE)nnand biterr off - make a bit error at offset (UNSAFE)#ifdef CONFIG_CMD_NAND_LOCK_UNLOCKnnand lock tight statusn bring nand to lock state or display locked pagesnnand unlock offset size - unlock section#endif);命令名称为nand,支持的最大参数个数为CONFIG_SYS_MAXARGS,命令重复次数为1,对应的实现函数为do_nand,后面的是用户输入nand -help时,将显示的帮助信息。在执行函数cmd中,第一个参数对应该命令结构本身的指针,第二个参数对应flag标记,第三个参数对应参数数目,第四个参数是指针数组,里面存储的是对应参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论