瀏覽代碼

修复emmc ota升级kernel等没做crc校验问题

huangliang 7 月之前
父節點
當前提交
a9207f462f
共有 2 個文件被更改,包括 69 次插入19 次删除
  1. 3 3
      u-boot/arch/arm/mach-arkmicro/armv7/ark_common.c
  2. 66 16
      u-boot/cmd/emmc.c

+ 3 - 3
u-boot/arch/arm/mach-arkmicro/armv7/ark_common.c

@@ -33,9 +33,9 @@ int ark_check_data_from_devide(char *file_name,unsigned int crc_data)
 {
 		char *update_fdt = NULL;
 		unsigned int size;
-		update_fdt = env_get("nandfdt");
+		update_fdt = env_get("boardfdt");
 		size = strlen(update_fdt);
-//		printf("update_fdt:%s,size %d\n", update_fdt,size);
+		printf("update_fdt:%s,size %d,file_name %s\n", update_fdt,size,file_name);
 		if(!strncmp(file_name, "u-boot.img", 10)){
 			if(sys_info.uboot_crc != 0){
 					if(crc_data != sys_info.uboot_crc)
@@ -77,7 +77,7 @@ int ark_check_data_from_devide(char *file_name,unsigned int crc_data)
 					if(crc_data != sys_info.fdt_crc)
 						return 1;
 			}else
-				sys_info.bootlogo_crc = crc_data;
+				sys_info.fdt_crc = crc_data;
 		}
 		else if(!strncmp(file_name, "ubootspl.bin", 12)){
 			if(sys_info.ubootspl_crc != 0){

+ 66 - 16
u-boot/cmd/emmc.c

@@ -695,20 +695,41 @@ static int do_update_rootfs_from_ota(char *partition_name, char *file_name)
 		return 1;
 	return 0;
 }
+
 static int get_data_from_ota(char *file_name)
 {
 	int ret = -1;
+	unsigned int file_size,crc_src;
 	char cmd[128] = { 0 };
+	unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
 	sprintf(cmd, "fatload emmc ota %s %s",env_get("loadaddr"), file_name);
 	printf("cmd=%s\n", cmd);
 	ret = run_command(cmd, 0);
-	return ret;
+	if(ret)
+	{
+		printf("Load %s from ota error!!\n",file_name);
+		return 1;
+	}
+	file_size = env_get_ulong("filesize", 16, 0x2000);
+	crc_src = crc32(0, (const unsigned char *)srcdata, file_size);
+	ret = ark_check_data_from_devide(file_name,crc_src);
+	if(ret)
+	{
+		printf("check data %s from ota crc error!!\n",file_name);
+		return 1;
+	}
+	printf("check ota partition crc ok!!\n");
+	return 0;
 }
+
 static int burn_data_2_emmc_partition(char *partition_name)
 {
 	char cmd[128] = { 0 };
 	int ret = -1;
 	int file_size = 0;
+	unsigned int crc_des = 0;
+	unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
+	unsigned int *dstdata = (unsigned int *)(env_get_hex("cmploadaddr", 0));
 	sprintf(cmd, "emmc erase.part %s", partition_name);
 	printf("cmd=%s\n", cmd);
 	ret = run_command(cmd, 0);
@@ -718,7 +739,25 @@ static int burn_data_2_emmc_partition(char *partition_name)
 	sprintf(cmd, "emmc write %s %s 0x%x", env_get("loadaddr"), partition_name, file_size);
 	printf("cmd=%s\n", cmd);
 	ret = run_command(cmd, 0);
-	return ret;
+	if(ret)
+	{
+		printf("emmc write data error!!!\n");
+		return 1;
+	}
+	sprintf(cmd, "emmc read %s %s 0x%x",env_get("cmploadaddr"),partition_name, file_size);
+	printf("cmd=%s\n", cmd);
+	ret = run_command(cmd, 0);
+	if(ret)
+	{
+		printf("emmc write data error!!!\n");
+		return 1;
+	}
+	crc_des = crc32(0, (const unsigned char *)dstdata, file_size);
+	ret  = ark_check_data_from_partition(partition_name,crc_des);
+	if(ret)
+		return 1;
+	printf("crc %s data OK!!!\n",partition_name);
+	return 0;
 }
 static int ark_update_emmc_partition(char *partition_name, char *file_name)
 {
@@ -726,7 +765,7 @@ static int ark_update_emmc_partition(char *partition_name, char *file_name)
 	printf("\r\n****** update %s from ota:%s .....\r\n",partition_name,file_name);
 	ret = get_data_from_ota(file_name);
 	if (!ret) {
-		burn_data_2_emmc_partition(partition_name);
+		return burn_data_2_emmc_partition(partition_name);
 	}
 	return ret;
 }
@@ -738,21 +777,32 @@ static int ark_update_emmc_rootfs_from_ota(char *partition_name, char *file_name
 	ret = do_update_rootfs_from_ota(partition_name,file_name);
 	return ret;
 }
+
 static int get_crc_data_from_ota(char *file_name)
 {
-	int ret;
-	ret = get_data_from_ota(file_name);
-	if (!ret) {
-		unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
-		unsigned int file_size = 0;
-		memset(&sys_info, 0, sizeof(struct SYS_INFO));
-		printf("file_name=%s\n", file_name);
-		file_size = env_get_ulong("filesize", 16, 0x2000);
-		memcpy(&sys_info, srcdata, file_size);
-		return 0;
-	}
-	return 1;
+	int ret = -1;
+	unsigned int file_size;
+	char cmd[128] = { 0 };
+	unsigned int *srcdata = (unsigned int *)(env_get_hex("loadaddr", 0));
+	memset(&sys_info, 0, sizeof(sys_info));
+	printf("file_name=%s\n", file_name);
+	sprintf(cmd, "fatload emmc ota %s %s",env_get("loadaddr"), file_name);
+	printf("cmd=%s\n", cmd);
+	ret = run_command(cmd, 0);
+	if(ret)
+		return 1;
+	file_size = env_get_ulong("filesize", 16, 0x2000);
+	memcpy(&sys_info, srcdata, file_size);
+//	printf("uboot_crc 		  = 0x%x\n",sys_info.uboot_crc);
+//	printf("fdt_crc			  = 0x%x\n",sys_info.fdt_crc);
+//	printf("zImage_crc 		  = 0x%x\n",sys_info.zImage_crc);
+//	printf("rootfs_crc		  = 0x%x\n",sys_info.rootfs_crc);
+//	printf("ubootspl_crc	  = 0x%x\n",sys_info.ubootspl_crc);
+//	printf("bootanimation_crc = 0x%x\n",sys_info.bootanimation_crc);
+//	printf("bootlogo_crc	  = 0x%x\n",sys_info.bootlogo_crc);
+	return 0;
 }
+
 #define ARK1668_UPDATE_MAGIC	"ada7f0c6-7c86-11e9-8f9e-2a86e4085a59"
 int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[])
 {
@@ -931,11 +981,11 @@ int do_update_from_ota(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[]
 	}
 	else
 	{
+		dis_pos_y = dis_pos_y + 20;
 		if (flag_partiton == 0)
 			 sprintf((char *)cmd,"disstring %d %d %s %d",dis_pos_x,dis_pos_y,"fdt",1);
 		else
 			 sprintf((char *)cmd,"disstring %d %d %s %d",dis_pos_x,dis_pos_y,"fdt_b",1);
-		dis_pos_y = dis_pos_y + 20;
 		printf("cmd=%s\n", cmd);
 		run_command(cmd, 0);
 		goto bootoldsys;