天天看点

uboot升级通过tftp烧写flash分区命令

在嵌入式开发过程中,我们需要将镜像文件烧写到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"
);