[Bugfix][bug-view-212][T800]Read fota package without skipping bad blocks
Only Configure: No
Affected branch: ZK-first-oem-release
Affected module: Version
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No
Change-Id: I6d7a9dc75fd02511c61bd99d8fafb54fad5be72d
diff --git a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
index 8fae757..c5af602 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/LYNQ_PUBLIC/IC_src/mtk/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -199,7 +199,7 @@
unsigned int current_slot = 0;
unsigned char rock_debug_buffer[512];
char g_delta_mtd[16];
-
+int g_addr_flag = 0;
OTA_STATUS fota_status;
@@ -473,34 +473,68 @@
int ret = 0,err = 0;
- if (lseek(fd_delta, offset + delta_offset, SEEK_SET) < 0) {
- err = -errno;
- rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
- return err;
- }
-
- do {
-
- ret = read(fd_delta, dest, size);
-
- if (ret == 0) {
- break;
- } else if (ret < 0) {
- if (errno == EINTR) {
- continue;
- }
+ if(g_addr_flag == 1)
+ {
+ if (mtk_device_wrap_seek(fd_delta, offset + delta_offset, SEEK_SET) < 0) {
err = -errno;
- rock_trace(ctx," Error reading metadata file\n");
-
- close(fd_delta);
-
+ rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
return err;
}
- size -= ret;
- dest += ret;
- } while(size > 0);
- return ret;
+ do {
+
+ ret = mtk_device_wrap_read(fd_delta, dest, size);
+
+ if (ret == 0)
+ {
+ break;
+ }
+ else if (ret < 0)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+ err = -errno;
+ rock_trace(ctx," Error reading metadata file\n");
+ mtk_device_wrap_close(fd_delta);
+ return err;
+ }
+ size -= ret;
+ dest += ret;
+ } while(size > 0);
+ }
+ else
+ {
+ if (lseek(fd_delta, offset + delta_offset, SEEK_SET) < 0)
+ {
+ err = -errno;
+ rock_trace(ctx, "mtk_device_wrap_seek df_delta err\n");
+ return err;
+ }
+ do {
+ ret = read(fd_delta, dest, size);
+ if (ret == 0)
+ {
+ break;
+ }
+ else if (ret < 0)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+ err = -errno;
+ rock_trace(ctx," Error reading metadata file\n");
+ close(fd_delta);
+ return err;
+ }
+ size -= ret;
+ dest += ret;
+ } while(size > 0);
+ }
+
+ return ret;
}
@@ -583,6 +617,7 @@
return E_ROCK_FOTA_ADDR;
}
RLOGD("+[UA]: get fota pack addr: %s\n",lynq_fota_addr);
+ get_delta_mtd(g_delta_mtd);
if(!(strcmp(lynq_fota_addr, "/tmp/fota.delta")))
{
ret = get_file_size();
@@ -591,33 +626,60 @@
RLOGD("the delta size over 50M\n");
return -1;
}
- get_delta_mtd(g_delta_mtd);
result = test_write_delta(lynq_fota_addr, g_delta_mtd);
if(result != 0)
{
RLOGD("fota.delta write into mtd fail !\n");
}
strcpy(lynq_fota_addr, g_delta_mtd);
- }
- if(lynq_fota_set_addr_value(lynq_fota_addr,strlen(lynq_fota_addr)))
- {
+ if(lynq_fota_set_addr_value(lynq_fota_addr,strlen(lynq_fota_addr)))
+ {
RLOGD("set addr fail\n");
return 1;
+ }
+ RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
+ fd_delta = mtk_device_wrap_open(lynq_fota_addr,O_RDWR);
+
+ if (fd_delta < 0) {
+ err = errno;
+ RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+ mtk_device_wrap_close(fd_delta);
+ return -err;
+ }
+ g_addr_flag = 1;
+
}
- RLOGD("+[UA]: get fota pack addr: %s\n", lynq_fota_addr);
+ else if(!(strcmp(lynq_fota_addr, g_delta_mtd)))
+ {
+ fd_delta = mtk_device_wrap_open(lynq_fota_addr,O_RDWR);
- fd_delta = open(lynq_fota_addr,O_RDWR);
+ if (fd_delta < 0) {
+ err = errno;
+ RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+ mtk_device_wrap_close(fd_delta);
+ return -err;
+ }
+ g_addr_flag = 1;
+ }
+ else
+ {
+ fd_delta = open(lynq_fota_addr,O_RDWR);
- if (fd_delta < 0) {
- err = errno;
- RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
- return -err;
+ if (fd_delta < 0) {
+ err = errno;
+ RLOGD("+[UA]: Error opening fota file: %s\n",strerror(errno));
+ close(fd_delta);
+ return -err;
+ }
+ g_addr_flag = 0;
+
}
fd_update_status = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
if (fd_update_status < 0) {
err = errno;
RLOGD("+[UA]: Error opening metadata file: %s\n",strerror(errno));
+ close(fd_update_status);
return -err;
}
memset(&up_info, 0, sizeof(up_info));
@@ -723,41 +785,80 @@
int err;
- if (lseek(fd_delta, start, SEEK_SET) < 0) {
- LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
- return -1;
- }
-
- if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0) {
- LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
- return -1;
- }
-
-
- do {
- memset(delta_data,0,NAND_PAGE_SIZE);
- ret = read(fd_delta, delta_data, NAND_PAGE_SIZE);
-
- if (ret == 0) {
- break;
- } else if (ret < 0) {
- if (errno == EINTR) {
- continue;
- }
- err = -errno;
-
- return err;
+ if(g_addr_flag == 1)
+ {
+ if (mtk_device_wrap_seek(fd_delta, start, SEEK_SET) < 0)
+ {
+ LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+ return -1;
}
-
- size -= NAND_PAGE_SIZE;
- mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
- //mtk_device_wrap_write(fd_curr,delta_data,ret);
- } while(size > 0);
-
-
- return 0;
-
+ if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0)
+ {
+ LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+ return -1;
+ }
+
+ do {
+ memset(delta_data,0,NAND_PAGE_SIZE);
+ ret = mtk_device_wrap_read(fd_delta, delta_data, NAND_PAGE_SIZE);
+
+ if (ret == 0)
+ {
+ break;
+ }
+ else if (ret < 0)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+ err = -errno;
+ return err;
+ }
+ size -= NAND_PAGE_SIZE;
+ mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
+ //mtk_device_wrap_write(fd_curr,delta_data,ret);
+ } while(size > 0);
+
+ }
+ else
+ {
+ if (lseek(fd_delta, start, SEEK_SET) < 0) {
+ LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+ return -1;
+ }
+
+ if (mtk_device_wrap_seek(fd_curr, 0, SEEK_SET) < 0) {
+ LYERRLOG("+[UA]: delta_copyto_nand seek err\n");
+ return -1;
+ }
+
+ do {
+ memset(delta_data,0,NAND_PAGE_SIZE);
+ ret = read(fd_delta, delta_data, NAND_PAGE_SIZE);
+
+ if (ret == 0)
+ {
+ break;
+ }
+ else if (ret < 0)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+ err = -errno;
+ return err;
+ }
+ size -= NAND_PAGE_SIZE;
+ mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
+ //mtk_device_wrap_write(fd_curr,delta_data,ret);
+
+ } while(size > 0);
+ }
+
+ return 0;
}
@@ -957,7 +1058,14 @@
RLOGD("+[UA]: update_mode = %d\n",update_mode);
memset(&delta_head, 0, sizeof(delta_head));
- read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+ if(g_addr_flag == 1)
+ {
+ mtk_device_wrap_read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+ }
+ else
+ {
+ read(fd_delta, (char *)&delta_head[0], sizeof(delta_head));
+ }
delta_size = 0;
@@ -1018,13 +1126,27 @@
memset(digest_s,0,SHA_DIGEST_SIZE);
memset(digest_t,0,SHA_DIGEST_SIZE);
memset(str_sha,0,40);
-
- lseek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
- read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+ if(g_addr_flag == 1)
+ {
+ mtk_device_wrap_seek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
+ mtk_device_wrap_read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+ }
+ else
+ {
+ lseek(fd_delta, sha_size + sizeof(delta_head), SEEK_SET);
+ read(fd_delta, digest_s, SHA_DIGEST_SIZE);
+ }
+
convert_hex(digest_s,str_sha);
RLOGD("+[UA]: delta save sha = %s\n",str_sha);
-
- ROCK_SHA_FILE_COMMON(fd_delta,sizeof(delta_head),sha_size,digest_t);
+ if(g_addr_flag == 1)
+ {
+ ROCK_SHA_FILE(fd_delta,sizeof(delta_head),sha_size,digest_t);
+ }
+ else
+ {
+ ROCK_SHA_FILE_COMMON(fd_delta,sizeof(delta_head),sha_size,digest_t);
+ }
memset(str_sha,0,40);
convert_hex(digest_t,str_sha);
RLOGD("+[UA]: delta calc sha = %s\n",str_sha);
@@ -1175,15 +1297,30 @@
fota_status.switch_slot = WAIT;
save_fota_status();
- if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0) {
- err = errno;
- RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
- system("echo fota-interface >/sys/power/wake_unlock");
- return -1;
+ if (g_addr_flag == 1)
+ {
+ if (mtk_device_wrap_seek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0)
+ {
+ err = errno;
+ RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
+ system("echo fota-interface >/sys/power/wake_unlock");
+ return -1;
+ }
+ mtk_device_wrap_read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
}
+ else
+ {
+
+ if (lseek(fd_delta, DELTA_HEARD_SIZE + delta_size, SEEK_SET) < 0)
+ {
+ err = errno;
+ RLOGD("+[UA]: mtk_device_wrap_seek df_delta err\n");
+ system("echo fota-interface >/sys/power/wake_unlock");
+ return -1;
+ }
+ read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
- read(fd_delta, full_header, DELTA_FULL_HEARD_SIZE);
-
+ }
if (memcmp(full_header, "full-ota", DELTA_FULL_HEARD_SIZE) != 0) {
RLOGD("+[UA]: invalid full delta header\r\n");
@@ -1256,8 +1393,14 @@
RLOGD("+[UA]: Start upgrading %s full.\n",partition_filename[i-MAX_OTA_ROLE/2]);
do{
status = delta_copyto_nand(delta_offset,delta_head[i]);
-
- ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
+ if(g_addr_flag == 1)
+ {
+ ROCK_SHA_FILE(fd_delta,delta_offset,delta_head[i],digest_s);
+ }
+ else
+ {
+ ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,delta_head[i],digest_s);
+ }
ROCK_SHA_FILE(fd_curr,0,delta_head[i],digest_t);
retry_cnt++;
}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
@@ -1536,8 +1679,8 @@
int sleep_count = 0;
char cmd_erase_target[128] = {0};
int retry = MD5_RETRY_TIME;
- unsigned char source_md5[MD5_READ_BUFFER_LEN] = {0};
- char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
+ unsigned char source_md5[MD5_READ_BUFFER_LEN] = {0};
+ char delta_data[ROCK_DEFAULT_BLOCK_SIZE];
//caclculate source md5 start
if(strcmp(source, DEV_SYSTEM_A) == 0 || strcmp(source, DEV_SYSTEM_B) == 0)
{
@@ -1630,7 +1773,7 @@
release_wake_lock("ab_recover");//unlock
RLOGD("+[UA]: copy end\n");
mtk_device_wrap_close(fd_target);
- mtk_device_wrap_close(fd_source);
+ mtk_device_wrap_close(fd_source);
if(ret < 0)
{
RLOGD("+[UA]: ret < 0\n");
@@ -1650,7 +1793,7 @@
{
RLOGD("+[UA]: md5_file_verfy FAIL!!!\n");
}
- return ret;
+ return ret;
}
//xf.li@20230401 add for ab rollback end