From eb427a8df2175a5c50d40869013002cf1f1c57d6 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 10 Mar 2021 21:38:19 +0100 Subject: [PATCH] properly handle flash size limits --- apps/octonet/ddupdate.c | 2 +- apps/octonet/flash.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/apps/octonet/ddupdate.c b/apps/octonet/ddupdate.c index 89dee96..d010eab 100644 --- a/apps/octonet/ddupdate.c +++ b/apps/octonet/ddupdate.c @@ -119,7 +119,7 @@ static int update_flash(struct ddflash *ddf) printf("Flash: %s\n", ddf->flash_name); printf("Version: %08x\n", ddf->id.hw); printf("REGMAP : %08x\n", ddf->id.regmap); - if ((res = update_image(ddf, fname, 0x10000, 0x100000, 1, 0)) == 1) + if ((res = update_image(ddf, fname, 0x10000, ddf->size / 2, 1, 0)) == 1) stat |= 1; return stat; } diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index cb0dbc9..8a6fb75 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -968,12 +968,10 @@ static int flashcmp(struct ddflash *ddf, int fs, uint32_t addr, uint32_t maxlen, return -1; len = off - fw_off; lseek(fs, fw_off, SEEK_SET); -#if 0 if (len > maxlen) { printf("file too big\n"); return -1; } -#endif //printf("flash file len %u, compare to %08x in flash: ", len, addr); for (j = 0; j < len; j += bl, addr += bl) { if (len - j < bl) @@ -1132,9 +1130,15 @@ static int check_fw(struct ddflash *ddf, char *fn, uint32_t *fw_off) return -4; } if (devid == ddf->id.device) { - if (version <= (ddf->id.hw & 0xffffff)) { - printf("%s is older or same version as flash\n", fn); - ret = -3; /* same id but no newer version */ + if (version < (ddf->id.hw & 0xffffff)) { + printf("%s is older version than flash\n", fn); + if (!ddf->force) + ret = -3; /* same id but older newer version */ + } + if (version == (ddf->id.hw & 0xffffff)) { + printf("%s is same version as flash\n", fn); + if (!ddf->force) + ret = 2; /* same and same version */ } } else ret = 1; @@ -1147,7 +1151,7 @@ out: } static int update_image(struct ddflash *ddf, char *fn, - uint32_t adr, uint32_t len, + uint32_t adr, uint32_t maxlen, int has_header, int no_change) { int fs, res = 0; @@ -1167,7 +1171,7 @@ static int update_image(struct ddflash *ddf, char *fn, printf("File %s not found \n", fn); return -1; } - res = flashcmp(ddf, fs, adr, len, fw_off); + res = flashcmp(ddf, fs, adr, maxlen, fw_off); if (res == -2) { printf("Flash already identical to %s\n", fn); if (ddf->force) { @@ -1177,9 +1181,9 @@ static int update_image(struct ddflash *ddf, char *fn, } if (res < 0) goto out; - res = flashwrite(ddf, fs, adr, len, fw_off); + res = flashwrite(ddf, fs, adr, maxlen, fw_off); if (res == 0) { - res = flashcmp(ddf, fs, adr, len, fw_off); + res = flashcmp(ddf, fs, adr, maxlen, fw_off); if (res == -2) { res = 1; printf("Flash verify OK!\n");