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