在嵌入式開發過程中,我們需要将鏡像檔案燒寫到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"
);