Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令
2016-06-19 18:56
453 查看
Uboot添加自定义命令:uboot中的命令使用U_BOOT_CMD这个宏声明来注册进系统,链接脚本会把所有的cmd_tbl_t结构体放在相邻的地方。
UBoot版本:u-boot-2013.01
一、U-Boot命令的格式
即使是内核的启动,也是通过U-Boot命令来实现的。U-Boot中每个命令都是通过 U_BOOT_CMD 宏来定义的,格式如下:
U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")
各项参数的意义如下:
1) -- name:命令的名字,注意,它不是一个字符串(不要用双引号括起来);
2)-- maxargs:最大的参数个数;
3)-- repeatable:命令是否可以重复,可重复是指运行一个命令后,下次敲回车即可再次运行;
4)-- command:对应的函数指针,类型为(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
5) -- usage:简单的使用说明,这是个字符串;
6)-- help:较详细的使用说明,这是个字符串。
宏U_BOOT_CMD 在include/command.h中定义,如下所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/29534b6819023f79e26f0d08b337888b)
而U_BOOT_CMD 是用一个struct cmd_tbl_s 结构体定义,这个结构体仍是在include/command.h中实现:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/189f7a2814459817d79935e1d5ff905b)
可以看出,对于每个使用U_BOOT_CMD 宏来定义的命令,就是宏 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)将struct cmd_tbl_s这样的一个命令结构体放到U-BOOT连接脚本 board/xxx/u-boot.lds中定义的".u-boot_cmd"段所在的内存区域,即在".u_boot_list.cmd"段中定义一个 cmd_tbl_t 结构。
连接脚本U-Boot.lds中有如下代码:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/ded8c25c1b771b94d7e0c2c42fb075f1)
当用户在u-boot的shell中输入命令时,就会在".u_boot_list.cmd"这个内存区域中查找( _u_boot_list_cmd__start - _u_boot_list_cmd__end),当该区域中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd()函数。
二、添加自定义命令
自定义命令设为"myubootcmd",不可与u-boot命令重名,
1、添加命令行配置信息
在u-boot-2013.01/include/configs/fs4412.h(由具体开发板来配置,这里使用fs4412)中添加 #define CONFIG_CMD_MYUBOOT,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/5843514334add391c04b1da81cdd6744)
2、编写命令行对应的源程序
在u-boot-2013.01/common/目录下,建立相应的命令执行文件cmd_hello.c
注意命名的规范,必须是cmd_xxx.c才行。里面的内容也是有格式要求的,如函数的格式,必须指定参数的;还有相应结尾部分的U_BOOT_CMD定义部分,使不能缺省的。如果命令不需要跟参数,则把maxargs设置为1即可了。内容如下所示:
[cpp] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_HELLO
void helloword (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
printf("hello world by xiaoqiang! \n");
}
U_BOOT_CMD(hello,1,2,helloword,
"hello command","xiaoqing add hello command!\n");
#endif
3、修改Makefile
在common/Makefile中增加一项.
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/5cb73f8b0bc203fc7a4d775a0d96c4c1)
4、编译
![](https://oscdn.geek-share.com/Uploads/Images/Content/201606/5fc06dd33cd9321105b6a72d13cbf6ca)
5、测试
UBoot版本:u-boot-2013.01
一、U-Boot命令的格式
即使是内核的启动,也是通过U-Boot命令来实现的。U-Boot中每个命令都是通过 U_BOOT_CMD 宏来定义的,格式如下:
U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")
各项参数的意义如下:
1) -- name:命令的名字,注意,它不是一个字符串(不要用双引号括起来);
2)-- maxargs:最大的参数个数;
3)-- repeatable:命令是否可以重复,可重复是指运行一个命令后,下次敲回车即可再次运行;
4)-- command:对应的函数指针,类型为(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
5) -- usage:简单的使用说明,这是个字符串;
6)-- help:较详细的使用说明,这是个字符串。
宏U_BOOT_CMD 在include/command.h中定义,如下所示
而U_BOOT_CMD 是用一个struct cmd_tbl_s 结构体定义,这个结构体仍是在include/command.h中实现:
可以看出,对于每个使用U_BOOT_CMD 宏来定义的命令,就是宏 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)将struct cmd_tbl_s这样的一个命令结构体放到U-BOOT连接脚本 board/xxx/u-boot.lds中定义的".u-boot_cmd"段所在的内存区域,即在".u_boot_list.cmd"段中定义一个 cmd_tbl_t 结构。
连接脚本U-Boot.lds中有如下代码:
当用户在u-boot的shell中输入命令时,就会在".u_boot_list.cmd"这个内存区域中查找( _u_boot_list_cmd__start - _u_boot_list_cmd__end),当该区域中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd()函数。
二、添加自定义命令
自定义命令设为"myubootcmd",不可与u-boot命令重名,
1、添加命令行配置信息
在u-boot-2013.01/include/configs/fs4412.h(由具体开发板来配置,这里使用fs4412)中添加 #define CONFIG_CMD_MYUBOOT,如下:
2、编写命令行对应的源程序
在u-boot-2013.01/common/目录下,建立相应的命令执行文件cmd_hello.c
注意命名的规范,必须是cmd_xxx.c才行。里面的内容也是有格式要求的,如函数的格式,必须指定参数的;还有相应结尾部分的U_BOOT_CMD定义部分,使不能缺省的。如果命令不需要跟参数,则把maxargs设置为1即可了。内容如下所示:
[cpp] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_HELLO
void helloword (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
printf("hello world by xiaoqiang! \n");
}
U_BOOT_CMD(hello,1,2,helloword,
"hello command","xiaoqing add hello command!\n");
#endif
3、修改Makefile
在common/Makefile中增加一项.
4、编译
5、测试
相关文章推荐
- 创业笔记6
- CSS
- C++网络编程之客户端程序
- JavaScript
- Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析
- Linux和Windows的区别
- 维护MMO项目的随想
- 创业笔记5
- 面向HBase的内存key-value缓存的实现
- Canvas绘图详解
- CSS基础
- 模拟粒子系统(ParticleSystem.Simulate)
- Exynos4412 Uboot 移植(五)—— Uboot 移植过程
- 创业笔记4
- 创业笔记3
- 第5章 在QEMU中进行软件测试
- 创业笔记2
- Exynos4412 Uboot 移植(六)—— 相关知识补充
- 创业笔记1
- 【超强攻略】如何使用腾讯云部署tomcat或者其他