]>
git.zerfleddert.de Git - hmcfgusb/blob - flash-hmcfgusb.c
244559d6e1d61dc1cf7bd499376f1db3a80ec06b
1 /* flasher for HM-CFG-USB
3 * Copyright (c) 2013-14 Michael Gernoth <michael@gernoth.net>
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to
7 * deal in the Software without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
32 #include <sys/types.h>
36 #include <libusb-1.0/libusb.h>
47 static int parse_hmcfgusb(uint8_t *buf
, int buf_len
, void *data
)
49 struct recv_data
*rdata
= data
;
59 int main(int argc
, char **argv
)
61 const char twiddlie
[] = { '-', '\\', '|', '/' };
62 struct hmcfgusb_dev
*dev
;
63 struct recv_data rdata
;
70 printf("HM-CFG-USB flasher version " VERSION
"\n\n");
74 fprintf(stderr
, "Missing firmware filename!\n\n");
76 fprintf(stderr
, "Syntax: %s hmusbif.enc\n\n", argv
[0]);
80 fw
= firmware_read_firmware(argv
[1], debug
);
84 hmcfgusb_set_debug(debug
);
86 memset(&rdata
, 0, sizeof(rdata
));
88 dev
= hmcfgusb_init(parse_hmcfgusb
, &rdata
);
90 fprintf(stderr
, "Can't initialize HM-CFG-USB\n");
94 if (!dev
->bootloader
) {
95 fprintf(stderr
, "\nHM-CFG-USB not in bootloader mode, entering bootloader.\n");
96 hmcfgusb_enter_bootloader(dev
);
97 fprintf(stderr
, "\nWaiting for device to reappear...\n");
101 } while ((dev
= hmcfgusb_init(parse_hmcfgusb
, &rdata
)) == NULL
);
103 if (!dev
->bootloader
) {
104 fprintf(stderr
, "Can't enter bootloader, giving up!\n");
109 printf("\nHM-CFG-USB opened.\n\n");
112 printf("Flashing %d blocks", fw
->fw_blocks
);
116 printf(": %c", twiddlie
[0]);
120 for (block
= 0; block
< fw
->fw_blocks
; block
++) {
121 len
= fw
->fw
[block
][2] << 8;
122 len
|= fw
->fw
[block
][3];
124 len
+= 4; /* block nr., length */
127 hexdump(fw
->fw
[block
], len
, "F> ");
130 if (!hmcfgusb_send(dev
, fw
->fw
[block
], len
, 0)) {
131 perror("\n\nhmcfgusb_send");
136 printf("Waiting for ack...\n");
139 pfd
= hmcfgusb_poll(dev
, 1);
140 if ((pfd
< 0) && errno
) {
141 if (errno
!= ETIMEDOUT
) {
142 perror("\n\nhmcfgusb_poll");
151 if (rdata
.ack
== 2) {
152 printf("\n\nFirmware update successfull!\n");
156 if (rdata
.ack
!= 1) {
157 fprintf(stderr
, "\n\nError flashing block %d, status: %u\n", block
, rdata
.ack
);
162 printf("\b%c", twiddlie
[block
% sizeof(twiddlie
)]);