Adds better processing of payload response
This commit is contained in:
parent
61c67bc051
commit
d0067b8a79
|
@ -2,19 +2,61 @@
|
|||
// Created by nock on 2019-05-21.
|
||||
//
|
||||
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <memory.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "fixkey-msg.h"
|
||||
#include "serial_util.h"
|
||||
#include "timer.h"
|
||||
|
||||
#define DEFAULT_SERIAL_PORT "/dev/ttyUSB0"
|
||||
#define RESPONSE_LEN 2
|
||||
#define MAX_RESPONSE_LEN 11
|
||||
|
||||
static void read_response(int serial_fd, uint8_t *dest, size_t *len) {
|
||||
static uint8_t buf[MAX_RESPONSE_LEN] = {0};
|
||||
static uint8_t *p = buf;
|
||||
timer_start(3);
|
||||
while (true) {
|
||||
int bytes_read = read(serial_fd, p, MAX_RESPONSE_LEN);
|
||||
if (bytes_read < 0) {
|
||||
if (errno == EAGAIN) {
|
||||
if (timer_expired()) {
|
||||
fprintf(stderr, "Timeout waiting for bootloader\n");
|
||||
exit(3);
|
||||
}
|
||||
usleep(250000);
|
||||
continue;
|
||||
}
|
||||
fprintf(stderr, "Failed to read from serial port: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
p += bytes_read;
|
||||
uint8_t *nl_p = memchr(buf, '\r', p-buf);
|
||||
if (nl_p) {
|
||||
*len = nl_p - buf;
|
||||
memcpy(dest, buf, *len);
|
||||
uint16_t new_buf_len = p - nl_p - 1; // +1 skips trailing \n
|
||||
if (new_buf_len) {
|
||||
p = buf;
|
||||
return;
|
||||
}
|
||||
memcpy(buf, nl_p+2, new_buf_len);
|
||||
p = buf+new_buf_len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dump_unexpected_response(uint8_t *buf, size_t len){
|
||||
uint8_t tmp[MAX_RESPONSE_LEN+1] = {0};
|
||||
memcpy(tmp, buf, len);
|
||||
fprintf(stderr, "Rx'd unexpected response: %s\n", tmp);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int c;
|
||||
|
@ -32,27 +74,27 @@ int main(int argc, char **argv) {
|
|||
|
||||
write(serial_fd, fixkey_msg, sizeof(fixkey_msg));
|
||||
|
||||
int bytes_read;
|
||||
uint8_t buf[RESPONSE_LEN];
|
||||
size_t out_len;
|
||||
uint8_t buf[MAX_RESPONSE_LEN];
|
||||
|
||||
timer_start(3);
|
||||
while ((bytes_read = read(serial_fd, buf, RESPONSE_LEN)) < RESPONSE_LEN) {
|
||||
if (bytes_read < 0 && errno != EAGAIN) {
|
||||
fprintf(stderr, "Failed to read response\n");
|
||||
return 2;
|
||||
read_response(serial_fd, buf, &out_len);
|
||||
if (!memcmp(buf, "hi", 2)) {
|
||||
printf("Received confirmation that payload is running");
|
||||
} else {
|
||||
dump_unexpected_response(buf, out_len);
|
||||
}
|
||||
if (timer_expired()) {
|
||||
fprintf(stderr, "Timeout waiting for response from bootloader\n");
|
||||
|
||||
read_response(serial_fd, buf, &out_len);
|
||||
if (!memcmp(buf, "ok", 2)) {
|
||||
printf("Payload reports success");
|
||||
return 0;
|
||||
} else if (!memcmp(buf, "badisn", 6)) {
|
||||
fprintf(stderr, "Payload reports unexpected flash contents");
|
||||
return 2;
|
||||
} else if (!memcmp(buf, "patchfail", 9)) {
|
||||
fprintf(stderr, "Payload reports that patch failed to apply");
|
||||
return 3;
|
||||
}
|
||||
usleep(250000);
|
||||
}
|
||||
if (!memcmp(buf, "ok", RESPONSE_LEN)) {
|
||||
return 0;
|
||||
} else {
|
||||
uint8_t tmp[RESPONSE_LEN+1] = {0};
|
||||
memcpy(tmp, buf, RESPONSE_LEN);
|
||||
fprintf(stderr, "Rx'd unexpected response: %s\n", tmp);
|
||||
}
|
||||
return 1;
|
||||
dump_unexpected_response(buf, out_len);
|
||||
return 4;
|
||||
}
|
|
@ -25,6 +25,11 @@
|
|||
#define IMAGE_CHUNK_SIZE 124 //216 // 124 for identical output to newtmgr
|
||||
#define MACRO_CHUNK_SIZE 302 //432 // 302 ""
|
||||
|
||||
/*
|
||||
* Larger values above greatly increase speed, but seem to break older
|
||||
* versions of mcuboot (like the one shipped with inital EM firmware)
|
||||
*/
|
||||
|
||||
#define CRC16_INITIAL_CRC 0 /* what to seed crc16 with */
|
||||
#define CRC_CITT_POLYMINAL 0x1021
|
||||
|
||||
|
|
Loading…
Reference in New Issue