在U-boot中添加命令

最近想再U-boot中加一个USB下载文件的命令,就研究啦一下U-Boot中的命令工作原理!
并且在VC里面建了一个工程,对里面的一些和硬件不相关的程序做了测试,下面写出来,也许对大家有用!
原理:
每个命令都有一个命令结构体
struct cmd_tbl_s {
char*name; /* Command Name*/
intmaxargs; /* maximum number of arguments*/
intrepeatable; /* autorepeat allowed?*/
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); /* Implementation function*/
char*usage;/* Usage message(short)*/
char*help;/* Help message(long)*/
};
去定义它。Cmd为要调用的命令函数!name为该命令名字符串。
在u-boot里面有这样的宏
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
宏U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将
cmd_tbl_s{
name,
maxargs,
rep,
cmd,
usage,
help
} 这样的一个命令结构体放入内存.u_boot_cmd这个区域,.u_boot_cmd这个域在board/smdk2410/u-boot.lds中定 义!在U-boot中的shell中,根据用户输入的命令,就会在.u_boot_cmd这个内存区域中查找,当.u_boot_cmd中某一个 cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令
结构体的cmd_tbl_s.cmd( ….)函数!
怎样添加命令函参数!
下面以添加USB下载命令为例!
a
在include/configs/smdk2410.h中的CONFIG_COMMDNDS中增加一项:
CFG_CMD_USBLOAD,
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NET | \
CFG_CMD_ENV | \
CFG_CMD_FLASH | \
CFG_CMD_PING | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_USBLOAD |\
CFG_CMD_ELF)
b
在include/cmd_confdefs.h中加入命令标志位
#define CFG_CMD_USBLOAD0x00000055ULL (可以是其它值,不冲突就好)
c
在common\下面加入usbload.c
框架如下
#If(CONFIG_COMMANDS & CFG_CMD_USBLOAD)
Int usb_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[ ] )
{
………………….
}
U_BOOT_CMD{
Usbload,
2,
1,
usb_load,
“usb load img file”,
“This is a test”
};
#endif
d
在common/Makefile 添加要编译的目标文件
e
重新编译u-boot,就OK啦!


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/59572/showart_1079825.html

 

 

原创作法:(已实验)

编写uboot的命令(load usb 为例)

1.进入uboot的源码的common/文件中,创建一个.c文件实现

实现内容如下

#include <common.h>

#include <command.h>

int do_hzl(cmd_tbl_t *cmtp,int flag,int argc,char *argv[])

{

        char buf[1024];

        if(argc != 2){

        printf("hzl:command error!!!");

        printf("hzl:usage\n     hzl <kernel_image_name>\n");

        return -1;

 

        }

        sprintf(buf,"fatload usb 0 0x30008000 %s",argv[1]);

        run_command("usb start",0);

        run_command("usb info",0);

        run_command(buf,0);

        run_command("usb stop",0);

        run_command("bootm 0x30008000",0);

        return 0;

 

}

 

U_BOOT_CMD(hzl,3,0,do_hzl,"test hzl command","help for hzl");

2.common/目录下的Makefile的文件中添加编译

#huangzhilong set

COBJS-y += cmd_hzl.o

3.重新编译uboot

Make mini2440_config

Make

4.将生成的uboot.binj-flash烧写。

执行命令hzl uimage进行烧写uimage,(uimage已经制作好的)

执行命令hzl rootfs.img 进行烧写文件系统

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值