在嵌入式开发过程中,我们需要将镜像文件烧写到flash的对应分区中。可以在uboot下通过tftp下载:
步骤
1.tftp命令下载文件到内存
2. nand erase擦除flash分区
3. 从内存烧写到flash
将这些操作封装成uboot命令:
要点:
1 模拟mtdparts命令获取分区信息;
2 tftp命令对应函数为tftpboot,下载的文件长度信息保存在变量。
#include <common.h>
#include <linux/mtd/mtd.h>
#include <command.h>
#include <string.h>
#include <environment.h>
#include <jffs2/jffs2.h>
#include <cli.h>
static unsigned long dft_load_addr = 0x1800000;
static int do_update_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char part_name[24] = {0};
char file_name[128] = {0};
char cmd_buf[256] = {0};
unsigned long file_size = 0;
// char *p_env = NULL;
struct mtd_device *dev;
struct part_info *part;
u8 pnum;
int ret;
if (argc < 3)
{
printf("%s",cmdtp->usage);
return -1;
}
strncpy(part_name, argv[1], min(sizeof(part_name),strlen(argv[1])));
strncpy(file_name, argv[2], min(sizeof(file_name),strlen(argv[2])));
printf("do_update_part: part_name:%s, file_name:%s\n", part_name, file_name);
//check if parts exist
ret = mtdparts_init();
if (ret)
{
printf("mtdparts_init failed!\n");
return ret;
}
ret = find_dev_and_part(part_name, &dev, &pnum, &part);
if (ret)
{
printf("part: %s is not exist!!\n", part_name);
run_command("mtdparts", 0);
return ret;
}
printf("find part:%s info: off (0x%x) size(0x%x)\n", part_name, (int)part->offset, (int)part->size);
//tftp download file
printf("tftp run, default load addr:%x", dft_load_addr);
sprintf(cmd_buf, "tftp %x %s", dft_load_addr, file_name);
ret = run_command(cmd_buf, 0);
if (ret)
{
printf("run tftp failed!\n");
return ret;
}
/*
p_env = getenv("filesize");
if (!p_env)
{
printf("env: filesize is not exist!!\n");
return -1;
}
file_size = simple_strtoul((const char *)p_env, NULL, 16);
*/
file_size = net_boot_file_size; /*tftp命令后,该变量记录下载文件的大小*/
printf("get filesize:0x%x\n", file_size);
printf("run nand erase.part %s\n", part_name);
sprintf(cmd_buf, "nand erase.part %s", part_name);
ret = run_command(cmd_buf, 0);
if (ret)
{
printf("nand erase.part failed!\n");
return ret;
}
printf("run nand write %x %s %x\n", dft_load_addr, part_name, file_size);
sprintf(cmd_buf, "nand write %x %s %x", dft_load_addr, part_name, file_size);
ret = run_command(cmd_buf, 0);
if (ret)
{
printf("nand write failed!\n");
return ret;
}
return ret;
}
U_BOOT_CMD(
update_part, CONFIG_SYS_MAXARGS, 0, do_update_part,
"update flash part img from tftp",
"\n"
" - Usage: update_part <part_name> <file_name>\n"
" please config your ip and serverip first & open the tftp server first.\n"
" and guarantee your ip and serverip in a local net and direct link with line or a net ap\n"
);