天天看點

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"
);