Micro2440 U-boot 编译实践 增加U-boot命令

u-boot移植实践3
3.1、修改源代码,使得下列u-boot初始环境变量为:
bootdealy  3
ipaddr  192.168.1.20
serverip  192.168.1.x  (x为虚拟机内linux的IP)
gateway 192.168.1.254
bootcmd   nfs 0x30008000 192.168.1.x:/nfs/micro2440/zImage.img;bootm 0x30008000


3.2、修改源代码,自定义命令cmdtest,运行该命令之后,显示“This is a new command test!”


解答:

3.1  直接修改U-boot源码包下的  /include/configs/mini2440.h

定位到这里修改即可:


3.2

U-Boot中每个命令都通过U_BOOT_CMD宏来定义,格式如下:(宏U_BOOT_CMD在include/command.h中定义)
 
U_BOOT_CMD(name, maxargs, repeatable, command, "usage", "help")

各项参数的意义为:
 
name:命令的名字,注意,它不是一个字符串,不要用双引号括起来。
 
maxargs:最大的参数个数
 
repeatable:命令是否可重复,指运行一个命令后,下次敲回车即可再次运行。
 
command:对应的函数指针,类型为(*cmd)(struct cmd_tbl_s *, int, int, char *[])。
 
usage:简短的使用说明,这是个字符串。
 
help:较详细的使用说明,这是个字符串。
 
对于每个使用U_BOOT_CMD宏来定义的命令,其实都是在“.u_boot_cmd”段中定义一个cmd_tbl_t结构。连接脚本u-boot.lds中有这么一段:

__u_boot_cmd_start = .;
 
.u_boot_cmd : { *(.u_boot_cmd) }
 
__u_boot_cmd_end = .;


宏 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将

struct cmd_tbl_s{
char *name,
int maxargs,
int repeatable,
int (*cmd)(struct cmd_tbl_s *,int,int,char*[]),
char *usage,
char *help
};


这样的一个命令结构体放到U-BOOT连接脚本 board/xxx/u-boot.lds中定义的".u-boot_cmd"段所在的内存区域。当用户在u-boot的shell中输入命令时,就会在".u_boot_cmd"这个内存区域中查找,当该区域中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd()函数。


具体实现步骤:

第一步:添加宏
在include/configs/mini2440.h中增加一项
#define CONFIG_CMD_CMDTEST


第二步:实现函数
在common/文件夹下建立cmd_cmdtest.c
#include <common.h>
#include <command.h>

#ifdef CONFIG_CMD_CMDTEST


void do_cmdtest(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 
{
printf("This is a new command test!\n");
}


U_BOOT_CMD(
cmdtest,   //uboot命令
1,   //不带参数
2,   //可重复
do_cmdtest,   //命令所对应的函数
"Not need argument.",  //用法提示
"A test command!\n"  //帮助信息
);
#endif

第三步:修改Makefile文件
修改common/Makefile,在“# command”下面增加:
COBJS-$(CONFIG_CMD_CMDTEST) += cmd_cmdtest.o


第四步:编译
make mini2440_config
make

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值