Ver código fonte

修复emmc升级时不能正确加载升级后新的文件系统的bug

huangliang 2 anos atrás
pai
commit
5fdce79978

+ 73 - 11
u-boot/board/arkmicro/ark1668e_devb_emmc/ark1668e_devb_emmc.c

@@ -408,7 +408,11 @@ static int do_update_from_media(void)
 	mdelay(30);
 	if(!ret)
 	{
-		sprintf(cmd, "setenv fdtsize %s",env_get("filesize"));
+		if(flag_partiton == 0)
+			sprintf(cmd, "setenv fdtsize_a %s",env_get("filesize"));
+		else
+			sprintf(cmd, "setenv fdtsize_b %s",env_get("filesize"));
+
 		run_command(cmd, 0);
 		printf("cmd=%s\n", cmd);	
 		mdelay(30);
@@ -426,7 +430,11 @@ static int do_update_from_media(void)
 	mdelay(30);
 	if(!ret)
 	{
-		sprintf(cmd, "setenv kernelsize %s",env_get("filesize"));
+		if(flag_partiton == 0)
+			sprintf(cmd, "setenv kernelsize_a %s",env_get("filesize"));
+		else
+			sprintf(cmd, "setenv kernelsize_b %s",env_get("filesize"));
+
 		printf("cmd=%s\n", cmd);
 		run_command(cmd, 0);
 		mdelay(30);
@@ -443,7 +451,7 @@ static int do_update_from_media(void)
 	{
 		sprintf(cmd, "setenv bootanimationsize %s",env_get("filesize"));
 		run_command(cmd, 0);
-		printf("cmd=%s\n", cmd);	
+		printf("cmd=%s\n", cmd);
 		mdelay(30);
 		sprintf((char *)cmd,"disconfig 30");
 		run_command(cmd, 0);
@@ -458,7 +466,7 @@ static int do_update_from_media(void)
 	{	
 		sprintf(cmd, "setenv reversingtracksize %s",env_get("filesize"));
 		run_command(cmd, 0);
-		printf("cmd=%s\n", cmd);	
+		printf("cmd=%s\n", cmd);
 		mdelay(30);
 		sprintf((char *)cmd,"disconfig 35");
 		run_command(cmd, 0);
@@ -506,6 +514,16 @@ static int do_update_from_media(void)
 		env_set("fdt_part", "fdt");
 		env_set("emmcroot", "/dev/mmcblk0p10 rw");
 
+		sprintf(cmd, "setenv fdtsize %s",env_get("fdtsize_a"));
+		run_command(cmd, 0);
+		printf("cmd=%s\n", cmd);
+		mdelay(30);
+
+		sprintf(cmd, "setenv kernelsize %s",env_get("kernelsize_a"));
+		run_command(cmd, 0);
+		printf("cmd=%s\n", cmd);
+		mdelay(30);
+
 	}
 	else if(!strcmp(update_dev, "usb"))
 	{
@@ -516,6 +534,18 @@ static int do_update_from_media(void)
 			env_set("kernel_part", "kernel_b");
 			env_set("fdt_part", "fdt_b");
 			env_set("emmcroot", "/dev/mmcblk0p14 rw");
+
+			sprintf(cmd, "setenv fdtsize %s",env_get("fdtsize_b"));
+			run_command(cmd, 0);
+			printf("cmd=%s\n", cmd);
+			mdelay(30);
+
+			sprintf(cmd, "setenv kernelsize %s",env_get("kernelsize_b"));
+			run_command(cmd, 0);
+			printf("cmd=%s\n", cmd);
+			mdelay(30);
+
+
 		}		
 		else if(!strcmp(curr_partition, "B"))
 		{
@@ -523,8 +553,17 @@ static int do_update_from_media(void)
 			env_set("kernel_part", "kernel");
 			env_set("fdt_part", "fdt");
 			env_set("emmcroot", "/dev/mmcblk0p10 rw");
-		}
 
+			sprintf(cmd, "setenv fdtsize %s",env_get("fdtsize_a"));
+			run_command(cmd, 0);
+			printf("cmd=%s\n", cmd);
+			mdelay(30);
+
+			sprintf(cmd, "setenv kernelsize %s",env_get("kernelsize_a"));
+			run_command(cmd, 0);
+			printf("cmd=%s\n", cmd);
+			mdelay(30);
+		}
 	}
 
 	mdelay(5);
@@ -557,6 +596,7 @@ int board_late_init(void)
 	char *update_from_ota = NULL,*need_update = NULL;
 	unsigned int loadaddr;
 	int do_update = 0, update_from_mmc = 1;
+	char *curr_partition = NULL;
 
 
 #ifdef CONFIG_USB_MUSB_HOST
@@ -569,7 +609,8 @@ int board_late_init(void)
  	need_update = env_get("need_update");
 	if (!strcmp(need_update, "yes")) {
 		loadaddr = env_get_hex("loadaddr", 0);
-
+		if (loadaddr)
+			memset((void*)loadaddr, 0, strlen(ARK1668_UPDATE_MAGIC));
 		sprintf(cmd, "fatload %s %s %s update-magic", "mmc", env_get("sd_dev_part"), env_get("loadaddr"));
 		printf("cmd %s\n",cmd);
 		run_command(cmd, 0);
@@ -587,17 +628,38 @@ int board_late_init(void)
 		if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
 			do_update = 1;
 			update_from_mmc = 0;
+			curr_partition  = env_get("updata_from_part");
+			printf("++updata_from_part %s++\n", curr_partition);
+			run_command("env default -f -a", 0);
+			mdelay(500);
+			if(!strcmp(curr_partition, "A"))
+			    env_set("updata_from_part", "A");
+			else if(!strcmp(curr_partition, "B"))
+			    env_set("updata_from_part", "B");
+			else
+			    env_set("updata_from_part", "A");
+			printf("++++++++++++++%s++++++++++\n",curr_partition);
 		} else {
 			printf("Wrong update magic, do not update from usb.\n");
 		}
 #endif
 	}
 	else if(!strcmp(update_from_ota, "yes")){
-
-		do_update = 0;		
-		sprintf(cmd, "update_from_emmc_ota");
-		printf("cmd=%s\n", cmd);	
-		run_command(cmd, 0); 
+			do_update = 0;
+			curr_partition  = env_get("updata_from_part");
+			printf("++updata_from_part %s++\n", curr_partition);
+			run_command("env default -f -a", 0);
+			mdelay(500);
+			if(!strcmp(curr_partition, "A"))
+				env_set("updata_from_part", "A");
+			else if(!strcmp(curr_partition, "B"))
+				env_set("updata_from_part", "B");
+			else
+				env_set("updata_from_part", "A");
+			printf("++++++++++++++%s++++++++++\n",curr_partition);
+			sprintf(cmd, "update_from_emmc_ota");
+			printf("cmd=%s\n", cmd);
+			run_command(cmd, 0);
 	}
 update_done:
 	if (do_update) {

+ 6 - 14
u-boot/cmd/emmc.c

@@ -911,6 +911,10 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 	env_set("updata_status", "ota");
 
 	loadaddr = env_get_hex("loadaddr", 0);
+
+	if (loadaddr)
+		memset((void*)loadaddr, 0, strlen(ARK1668_UPDATE_MAGIC));
+
 	sprintf(cmd, "fatload emmc ota %s %s ", env_get("loadaddr"),"update-magic");
 	run_command(cmd, 0);
 	if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
@@ -923,7 +927,6 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 	sprintf((char *)cmd,"disconfig 8");
 	run_command(cmd, 0);
 
-
 	curr_partition = env_get("updata_from_part");
 	if(!strcmp(curr_partition, "A"))
 		flag_partiton = 1;
@@ -945,7 +948,6 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 	else if(ret == CHECKDATA_ERROR)
 		goto bootoldsys;
 
-
 	printf("\r\n **** update from update uboot .....\r\n");
 	ret = ark_update_emmc_partition("bootloader", "u-boot.img");
 	mdelay(30);
@@ -1078,7 +1080,7 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 		env_set("updata_from_part", "B");
 		env_set("kernel_part", "kernel_b");
 		env_set("fdt_part", "fdt_b");
-		env_set("emmcroot", "/dev/mmcblk0p13 rw");
+		env_set("emmcroot", "/dev/mmcblk0p14 rw");
 		sprintf(cmd, "setenv fdtsize %s",env_get("fdtsize_b"));
 		run_command(cmd, 0);
 		printf("cmd=%s\n", cmd);	
@@ -1089,18 +1091,13 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 		printf("cmd=%s\n", cmd);	
 		mdelay(30);
 
-
-		sprintf(cmd, "setenv bootanimationsize %s",env_get("bootanimationsize_b"));
-		run_command(cmd, 0);
-		printf("cmd=%s\n", cmd);	
-		mdelay(30);
 	}		
 	else if(!strcmp(curr_partition, "B"))
 	{
 		env_set("updata_from_part", "A");
 		env_set("kernel_part", "kernel");
 		env_set("fdt_part", "fdt");
-		env_set("emmcroot", "/dev/mmcblk0p9 rw");
+		env_set("emmcroot", "/dev/mmcblk0p10 rw");
 
 		sprintf(cmd, "setenv fdtsize %s",env_get("fdtsize_a"));
 		run_command(cmd, 0);
@@ -1112,11 +1109,6 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 		printf("cmd=%s\n", cmd);	
 		mdelay(30);
 
-
-		sprintf(cmd, "setenv bootanimationsize %s",env_get("bootanimationsize_a"));
-		run_command(cmd, 0);
-		printf("cmd=%s\n", cmd);	
-		mdelay(30);
 	}
 
 	env_set("updata_status", "ok");