【ok210试用体验】如何添加一个简单的U-boot命令 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【ok210试用体验】如何添加一个简单的U-boot命令

陈星 ( 楼主 ) 2015-9-23 18:11:18  只看该作者 倒序浏览
    在分析
start_armboot时,我们可以找到run_command函数,在其中会发现所有命令的格式都是由一个结构体定义的cmd_tbl_s。
  1. struct cmd_tbl_s {
  2.         char                *name;                /* Command Name                        */
  3.         int                maxargs;        /* maximum number of arguments        */
  4.         int                repeatable;        /* autorepeat allowed?                */
  5.                                         /* Implementation function        */
  6.         int                (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
  7.         char                *usage;                /* Usage message        (short)        */
  8. #ifdef        CFG_LONGHELP
  9.         char                *help;                /* Help  message        (long)        */
  10. #endif
  11. #ifdef CONFIG_AUTO_COMPLETE
  12.         /* do auto completion on the arguments */
  13.         int                (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
  14. #endif
  15. };
复制代码
   这里定义了命令的名字、长度、帮助等信息。
    在分析find_command函数时会发现,这里使用到了命令的头和尾。
  1. for (cmdtp = &__u_boot_cmd_start;
  2.              cmdtp != &__u_boot_cmd_end;
  3.              cmdtp++)
复制代码
   它们的定义可以在u-boot.lds中找到:

  1.         __u_boot_cmd_start = .;
  2.         .u_boot_cmd : { *(.u_boot_cmd) }
  3.         __u_boot_cmd_end = .;
复制代码
   这里是所有指令存放的段。
    在Command.h中找到如下代码:
  1. #define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))
  2. #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)
  3. cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
复制代码
   这里使用宏定义了上述类型,可以发现上面会将指令强制定义为
.u_boot_cmd的段属性,这样就将命令放在了上面的命令段中。   
    在随便找一个命令会发现如下的定义:
  1. U_BOOT_CMD(
  2.         go, CFG_MAXARGS, 1,        do_go,
  3.         "go      - start application at address 'addr'n",
  4.         "addr [arg ...]n    - start application at address 'addr'n"
  5.         "      passing 'arg' as argumentsn"
  6. );
复制代码
   这里就会将命令的命令、属性、是否可重复、名称、短帮助信息,长帮助信息。
    因此,我们可以建立一个简单的命令:
  1.                 #include
  2.                 #include
  3.                 int  do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
  4. {
  5.   int i;
  6.   printf("Hello World!, %dn", argc);

  7.   for(i = 0 ; i
  8. {
  9. printg("argv[%d]: %sn", i, argv[i]);
  10. }
  11. return 0;
  12. }                    

  13. U_BOOT_CMD(
  14. hello,        CFG_MAXARGS,        1,        do_hello,
  15. "hello - just for testn",
  16. "hello, long help......................n"}
复制代码
   将代码拷贝到command.c中,并将command文件夹中的Makefile中添加配置。
    然后进行编译,之后烧写到开发板中,进入U-BOOT命令,输入help就可以看到该命令了,也可以输入命令进行测试。

    由于我还不知道如何烧写U-BOOT,手册上只有SD烧写,比较麻烦,没有经过测试,大家有兴趣可以去测试一下。







0个回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-12-4 01:21 , Processed in 0.774177 second(s), Total 66, Slave 45 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表