在开发板中烧写uboot是一件很烦的事情,如果uboot能实现bubt命令,则会很方便。
1在cmd_confdefs.h 定义
#define CFG_CMD_BUBT 0x8000000000000000ULL /* bubt support */可以更改该值,不能与其他命令的标志位冲突。
同时修改宏CONFIG_COMMANDS,添加bubt命令标志位:
#define CONFIG_COMMANDS (CFG_CMD_DHCP | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_BDI | CFG_CMD_MEMORY | CFG_CMD_FLASH | CFG_CMD_ENV | CFG_CMD_LOADB|CFG_CMD_BUBT)
定义宏:
#define CFG_MONITOR_BASE X (X根据实际情况确定,比如CFG_FLASH_BASE)
#define CFG_MONITOR_LEN (252>>10)(其他值也可以)
在我们的开发板,这些宏定义:
#define CFG_MONITOR_BASE CFG_FLASH_BASE
#define CFG_MONITOR_LEN (252>>10)(其他值也可以)
#define CFG_MONITOR_IMAGE_OFFSET 0
另外要定义环境变量的大小以及偏移地址
2添加文件:cmd_bubt.c
/*in bubt.c*/
#if (CONFIG_COMMANDS & CFG_CMD_RUN)
int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
U_BOOT_CMD(
run, CFG_MAXARGS, 1, do_run,
"run - run commands in an environment variable\n",
"var [...]\n"
" - run the commands in the environment variable(s) 'var'\n"
);
#endif /* CFG_CMD_RUN */
#if (CONFIG_COMMANDS & CFG_CMD_BUBT)
static unsigned int flash_in_which_sec(flash_info_t *fl,unsigned int offset)
{
unsigned int sec_num;
if(NULL == fl)
return 0xFFFFFFFF;
for( sec_num = 0; sec_num < fl->sector_count ; sec_num++){
/* If last sector*/
if (sec_num == fl->sector_count -1)
{
if((offset >= fl->start[sec_num] - fl->start[0]) &&
(offset < fl->size) )
{
return sec_num;
}
}
else
{
if((offset >= fl->start[sec_num] - fl->start[0]) &&
(offset < fl->start[sec_num + 1] - fl->start[0]) )
{
return sec_num;
}
}
}
/* return illegal sector Number */
return 0xFFFFFFFF;
}
/*******************************************************************************
burn a u-boot.bin on the Boot Flash
********************************************************************************/
extern flash_info_t flash_info[]; /* info for FLASH chips */
#include
int burn_uboot_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int filesize;
unsigned int s_first,s_end,env_sec;
extern char console_buffer[];
s_first = flash_in_which_sec(&flash_info[0],
CFG_MONITOR_BASE - flash_info[0].start[0]);
s_end = flash_in_which_sec(&flash_info[0],
CFG_MONITOR_BASE + CFG_MONITOR_LEN -1 - flash_info[0].start[0]);
env_sec = flash_in_which_sec(&flash_info[0],
CFG_ENV_ADDR - flash_info[0].start[0]);
load_addr = 0x100000;
if(argc == 2) {
copy_filename (BootFile, argv[1], sizeof(BootFile));
}
else {
copy_filename (BootFile, "u-boot.bin", sizeof(BootFile));
printf("using default file \"u-boot.bin\" \n");
}
if ((filesize = NetLoop(TFTP)) < 0)
return 0;
printf("Un-Protect Flash Monitor space\n");
flash_protect (FLAG_PROTECT_CLEAR,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE + CFG_MONITOR_LEN - 1,
&flash_info[0]);
printf("Override Env parameters? (y/n)");
readline(" ");
if( strcmp(console_buffer,"Y") == 0 ||
strcmp(console_buffer,"yes") == 0 ||
strcmp(console_buffer,"y") == 0 ) {
flash_protect (FLAG_PROTECT_CLEAR,
flash_info[0].start[env_sec],
flash_info[0].start[env_sec] + CFG_ENV_SECT_SIZE - 1,
&flash_info[0]);
printf("Erase Env parameters sector %d... ",env_sec);
flash_erase(&flash_info[0], env_sec, env_sec);
flash_protect (FLAG_PROTECT_SET,
flash_info[0].start[env_sec],
flash_info[0].start[env_sec] + CFG_ENV_SECT_SIZE - 1,
&flash_info[0]);
}
printf("Erase %d - %d sectors... ",s_first,s_end);
flash_erase(&flash_info[0], s_first, s_end);
printf("Copy to Flash... ");
flash_write ( (uchar *)0x100000 + CFG_MONITOR_IMAGE_OFFSET,
CFG_MONITOR_BASE,
filesize - CFG_MONITOR_IMAGE_OFFSET);
printf("done\nProtect Flash Monitor space\n");
flash_protect (FLAG_PROTECT_SET,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE + CFG_MONITOR_LEN - 1,
&flash_info[0]);
return 1;
}
U_BOOT_CMD(
bubt, 2, 1, burn_uboot_cmd,
"bubt - Burn an image on the Boot Flash.\n",
" file-name \n"
"\tBurn a binary image on the Boot Flash, default file-name is u-boot.bin .\n"
);
#endif
3 添加和修改Makefile文件
4 编译 烧写
后记:
我们所使用的开发板环境变量的偏移地址是:0x40000,uboot的使用空间为1M,如果改成512K的话,该函数需要修改。
阅读(3958) | 评论(1) | 转发(0) |