From 2d1f08acdf0ad50acfb1ae258063a0b169588c35 Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Sun, 16 Feb 2014 15:30:00 +0100 Subject: [PATCH 1/1] reboot before flashing and retry a bit more often --- flash-hmcfgusb.c | 12 +++++------- flash-ota.c | 40 +++++++++++++++++++++++++++++++++++----- version.h | 2 +- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/flash-hmcfgusb.c b/flash-hmcfgusb.c index 244559d..45d467f 100644 --- a/flash-hmcfgusb.c +++ b/flash-hmcfgusb.c @@ -97,13 +97,11 @@ int main(int argc, char **argv) fprintf(stderr, "\nWaiting for device to reappear...\n"); do { - sleep(2); - } while ((dev = hmcfgusb_init(parse_hmcfgusb, &rdata)) == NULL); - - if (!dev->bootloader) { - fprintf(stderr, "Can't enter bootloader, giving up!\n"); - exit(EXIT_FAILURE); - } + if (dev) { + hmcfgusb_close(dev); + } + sleep(1); + } while (((dev = hmcfgusb_init(parse_hmcfgusb, &rdata)) == NULL) || (!dev->bootloader)); } printf("\nHM-CFG-USB opened.\n\n"); diff --git a/flash-ota.c b/flash-ota.c index cbda024..034ae78 100644 --- a/flash-ota.c +++ b/flash-ota.c @@ -41,6 +41,8 @@ #include "version.h" #include "hmcfgusb.h" +#define MAX_RETRIES 5 + uint32_t hmid = 0; uint32_t my_hmid = 0; @@ -135,7 +137,13 @@ int send_hm_message(struct hmcfgusb_dev *dev, struct recv_data *rdata, uint8_t * ((rdata->status & 0xff) == 0x02)) { break; } else { - fprintf(stderr, "\nInvalid status: %04x\n", rdata->status); + if ((rdata->status & 0xff00) == 0x0400) { + fprintf(stderr, "\nOut of credits!\n"); + } else if ((rdata->status & 0xff) == 0x08) { + fprintf(stderr, "\nMissing ACK!\n"); + } else { + fprintf(stderr, "\nInvalid status: %04x\n", rdata->status); + } return 0; } } @@ -228,12 +236,34 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + printf("\nRebooting HM-CFG-USB to avoid running out of credits\n\n"); + + if (!dev->bootloader) { + printf("HM-CFG-USB not in bootloader mode, entering bootloader.\n"); + hmcfgusb_enter_bootloader(dev); + printf("Waiting for device to reappear...\n"); + + do { + if (dev) { + hmcfgusb_close(dev); + } + sleep(1); + } while (((dev = hmcfgusb_init(parse_hmcfgusb, &rdata)) == NULL) || (!dev->bootloader)); + } + if (dev->bootloader) { - fprintf(stderr, "\nHM-CFG-USB in bootloader mode, aborting!\n"); - exit(EXIT_FAILURE); + printf("HM-CFG-USB in bootloader mode, rebooting\n"); + hmcfgusb_leave_bootloader(dev); + + do { + if (dev) { + hmcfgusb_close(dev); + } + sleep(1); + } while (((dev = hmcfgusb_init(parse_hmcfgusb, &rdata)) == NULL) || (dev->bootloader)); } - printf("\nHM-CFG-USB opened\n\n"); + printf("\n\nHM-CFG-USB opened\n\n"); memset(out, 0, sizeof(out)); out[0] = 'K'; @@ -424,7 +454,7 @@ int main(int argc, char **argv) } else { pos = &(fw->fw[block][2]); cnt++; - if (cnt == 3) { + if (cnt == MAX_RETRIES) { fprintf(stderr, "\nToo many errors, giving up!\n"); exit(EXIT_FAILURE); } else { diff --git a/version.h b/version.h index aa8235f..c5a8e57 100644 --- a/version.h +++ b/version.h @@ -1 +1 @@ -#define VERSION "0.093-git" +#define VERSION "0.094-git" -- 2.39.5