Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3403900
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类: LINUX

2008-07-13 15:15:53

在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啦!
阅读(1563) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

happy24682012-06-29 13:51:21

请问u-boot 要开启usb 功能compiler后出现下列错误,没有定义这些function,要怎么修改?我cpu 是davinci,谢谢您
/root/u-boot-1.3.4_25MHz_test/common/usb.c:134: undefined reference to `usb_lowlevel_stop'
common/libcommon.a(usb.o)(.text+0x80): In function `usb_submit_int_msg':
/root/u-boot-1.3.4_25MHz_test/common/usb.c:158: undefined reference to `submit_int_msg'
common/libcommon.a(usb.o)(.text+0x114): In function `usb_control_msg':
/root/u-boot-1.3.4_25MHz_test/common/usb.c:188: undefined reference t