FreeCalypso > hg > freecalypso-tools
comparison loadtools/romload.c @ 633:4dca8542f569
loadtools/romload.c: collect additional response bytes after >p and >c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 01 Mar 2020 00:57:12 +0000 |
parents | aba969153d20 |
children | 3172e3111ab7 |
comparison
equal
deleted
inserted
replaced
632:ae4330d86029 | 633:4dca8542f569 |
---|---|
148 write(target_fd, beacon_cmd, sizeof beacon_cmd); | 148 write(target_fd, beacon_cmd, sizeof beacon_cmd); |
149 while (expect_response(beacon_interval) != 'i'); | 149 while (expect_response(beacon_interval) != 'i'); |
150 return 0; | 150 return 0; |
151 } | 151 } |
152 | 152 |
153 static int | |
154 expect_add_response(buf, expect_bytes, timeout) | |
155 u_char *buf; | |
156 { | |
157 fd_set fds; | |
158 struct timeval tv; | |
159 int pass, cc; | |
160 | |
161 for (pass = 0; pass < expect_bytes; ) { | |
162 FD_ZERO(&fds); | |
163 FD_SET(target_fd, &fds); | |
164 tv.tv_sec = 0; | |
165 tv.tv_usec = timeout * 1000; | |
166 cc = select(target_fd+1, &fds, NULL, NULL, &tv); | |
167 if (cc < 0) { | |
168 if (errno == EINTR) | |
169 continue; | |
170 perror("select"); | |
171 exit(1); | |
172 } | |
173 if (cc < 1) | |
174 return(-1); | |
175 cc = read(target_fd, buf + pass, expect_bytes - pass); | |
176 if (cc <= 0) { | |
177 perror("read after successful select"); | |
178 exit(1); | |
179 } | |
180 pass += cc; | |
181 } | |
182 return(0); | |
183 } | |
184 | |
153 static uint32_t | 185 static uint32_t |
154 compute_block_cksum() | 186 compute_block_cksum() |
155 { | 187 { |
156 uint32_t sum; | 188 uint32_t sum; |
157 int i, llen; | 189 int i, llen; |
166 perform_romload() | 198 perform_romload() |
167 { | 199 { |
168 int resp; | 200 int resp; |
169 uint16_t image_cksum; | 201 uint16_t image_cksum; |
170 unsigned long rec_count; | 202 unsigned long rec_count; |
203 u_char addresp[2]; | |
171 static int zero = 0; | 204 static int zero = 0; |
172 | 205 |
173 if (open_srec_file(&iramimage) < 0) | 206 if (open_srec_file(&iramimage) < 0) |
174 exit(1); | 207 exit(1); |
175 set_fixed_baudrate("19200"); | 208 set_fixed_baudrate("19200"); |
191 resp); | 224 resp); |
192 else | 225 else |
193 fprintf(stderr, | 226 fprintf(stderr, |
194 "Got > %02X in response to <p command; expected >p\n", | 227 "Got > %02X in response to <p command; expected >p\n", |
195 resp); | 228 resp); |
229 exit(1); | |
230 } | |
231 resp = expect_add_response(addresp, 2, INTERMEDIATE_TIMEOUT); | |
232 if (resp < 0 || addresp[0] != 0x00 || addresp[1] != 0x04) { | |
233 fprintf(stderr, | |
234 "error: extra bytes after >p not received as expected\n"); | |
196 exit(1); | 235 exit(1); |
197 } | 236 } |
198 printf("<p command successful, switching to %s baud\n", | 237 printf("<p command successful, switching to %s baud\n", |
199 romload_baud_rate->name); | 238 romload_baud_rate->name); |
200 set_serial_baudrate(romload_baud_rate); | 239 set_serial_baudrate(romload_baud_rate); |
288 fprintf(stderr, | 327 fprintf(stderr, |
289 "Got > %02X in response to <c command; expected >c\n", | 328 "Got > %02X in response to <c command; expected >c\n", |
290 resp); | 329 resp); |
291 exit(1); | 330 exit(1); |
292 } | 331 } |
332 resp = expect_add_response(addresp, 1, INTERMEDIATE_TIMEOUT); | |
333 if (resp < 0) { | |
334 fprintf(stderr, | |
335 "error: extra byte after >c not received as expected\n"); | |
336 exit(1); | |
337 } | |
293 printf("<c command successful, sending <b\n"); | 338 printf("<c command successful, sending <b\n"); |
294 | 339 |
295 bcopy(iramimage.record + 1, branch_cmd + 2, 4); | 340 bcopy(iramimage.record + 1, branch_cmd + 2, 4); |
296 write(target_fd, branch_cmd, sizeof branch_cmd); | 341 write(target_fd, branch_cmd, sizeof branch_cmd); |
297 resp = expect_response(INTERMEDIATE_TIMEOUT); | 342 resp = expect_response(INTERMEDIATE_TIMEOUT); |