Adds in optional fast_mode for later c3w bootloaders
This commit is contained in:
parent
f1f64667f3
commit
50f987eb48
|
@ -28,6 +28,6 @@ void _bail_out(err_t code, const char *function, const char *file, unsigned line
|
|||
if (code < ERR_LAST) {
|
||||
err_string = error_strings[code];
|
||||
}
|
||||
fprintf(stderr, "Fatal Error in %s @ %s:%u: %s\n", function, file, line, err_string);
|
||||
fprintf(stderr, "Fatal Error in %s() @ %s:%u: %s\n", function, file, line, err_string);
|
||||
exit(code);
|
||||
}
|
|
@ -21,7 +21,7 @@ static int gpio_open(char const *gpio) {
|
|||
sprintf(gpio_path, fmt_str, gpio);
|
||||
int fd = open(gpio_path, O_WRONLY);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "Failed to open %s: %s", gpio_path, strerror(errno));
|
||||
fprintf(stderr, "Failed to open %s: %s\n", gpio_path, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
|
@ -29,6 +29,9 @@ static int gpio_open(char const *gpio) {
|
|||
|
||||
void gpio_ble_reset(void) {
|
||||
int fd = gpio_open(EM_BLE_RESET_GPIO);
|
||||
if (fd < 0) {
|
||||
return;
|
||||
}
|
||||
if (write(fd, "0", 1) < 1) {
|
||||
fprintf(stderr, "Failed to assert reset line\n");
|
||||
}
|
||||
|
@ -45,6 +48,9 @@ void gpio_ble_reset(void) {
|
|||
|
||||
void gpio_ble_req_bootloader(void) {
|
||||
int fd = gpio_open(EM_BLE_REQ_GPIO);
|
||||
if (fd < 0) {
|
||||
return;
|
||||
}
|
||||
if (write(fd, "0", 1) < 1) {
|
||||
fprintf(stderr, "Failed to assert bootloader_req\n");
|
||||
}
|
||||
|
|
48
src/image.c
48
src/image.c
|
@ -27,8 +27,14 @@
|
|||
#include "sha256.h"
|
||||
#endif
|
||||
|
||||
#define IMAGE_CHUNK_SIZE 124 //216 // 124 for identical output to newtmgr
|
||||
#define MACRO_CHUNK_SIZE 302 //432 // 302 ""
|
||||
|
||||
/* These values produce output identical to mcumgr *if* DO_UPLOAD_SHA is defined */
|
||||
#define IMAGE_CHUNK_SIZE 124 // 124 for identical output to newtmgr
|
||||
#define MACRO_CHUNK_SIZE 302 // 302 ""
|
||||
|
||||
/* Fast mode doesn't support original EM bootloader, but is much faster with later bootloaders */
|
||||
#define IMAGE_CHUNK_SIZE_FAST 216
|
||||
#define MACRO_CHUNK_SIZE_FAST 432
|
||||
|
||||
/*
|
||||
* Larger values above greatly increase speed, but seem to break older
|
||||
|
@ -40,6 +46,16 @@
|
|||
|
||||
static int serial_fd = -1;
|
||||
|
||||
static bool g_fast_mode = false;
|
||||
|
||||
void image_set_fast_mode(void) {
|
||||
g_fast_mode = true;
|
||||
}
|
||||
|
||||
static bool image_get_fast_mode(void) {
|
||||
return g_fast_mode;
|
||||
}
|
||||
|
||||
void image_help(void){
|
||||
BAIL_OUT(ERR_USAGE);
|
||||
}
|
||||
|
@ -191,7 +207,7 @@ static char *get_version(void) {
|
|||
return version;
|
||||
}
|
||||
|
||||
static void wrap_and_send_pkt(uint8_t *data, size_t len) {
|
||||
static void wrap_and_send_pkt(uint8_t *data, size_t len, bool fast_mode) {
|
||||
assert(data != NULL);
|
||||
assert(len != 0);
|
||||
static uint8_t seq = 67;
|
||||
|
@ -235,7 +251,13 @@ static void wrap_and_send_pkt(uint8_t *data, size_t len) {
|
|||
}
|
||||
|
||||
size_t remaining = out_buf + out_len - pos;
|
||||
size_t to_write = remaining > IMAGE_CHUNK_SIZE ? IMAGE_CHUNK_SIZE : remaining;
|
||||
size_t to_write;
|
||||
if (fast_mode) {
|
||||
to_write = remaining > IMAGE_CHUNK_SIZE_FAST ? IMAGE_CHUNK_SIZE_FAST : remaining;
|
||||
} else {
|
||||
to_write = remaining > IMAGE_CHUNK_SIZE ? IMAGE_CHUNK_SIZE : remaining;
|
||||
}
|
||||
|
||||
write(serial_fd, pos, to_write);
|
||||
write(serial_fd, "\n", 1);
|
||||
pos += to_write;
|
||||
|
@ -244,7 +266,7 @@ static void wrap_and_send_pkt(uint8_t *data, size_t len) {
|
|||
fsync(serial_fd);
|
||||
}
|
||||
|
||||
void do_upload(char *filename){
|
||||
void do_upload(char *filename, bool fast_mode){
|
||||
serial_flush(serial_fd);
|
||||
size_t pos = 0, len;
|
||||
uint8_t const *payload;
|
||||
|
@ -279,12 +301,18 @@ void do_upload(char *filename){
|
|||
len = fixkey_payload_len;
|
||||
}
|
||||
|
||||
size_t base_chunk_len;
|
||||
if (fast_mode) {
|
||||
base_chunk_len = MACRO_CHUNK_SIZE_FAST;
|
||||
} else {
|
||||
base_chunk_len = MACRO_CHUNK_SIZE;
|
||||
}
|
||||
while (pos < len){
|
||||
size_t data_chunk_len;
|
||||
if (pos == 0) {
|
||||
data_chunk_len = MACRO_CHUNK_SIZE;
|
||||
data_chunk_len = base_chunk_len;
|
||||
} else {
|
||||
data_chunk_len = MACRO_CHUNK_SIZE + 45;
|
||||
data_chunk_len = base_chunk_len + 45;
|
||||
}
|
||||
CborEncoder root, map;
|
||||
uint8_t cbor_buf[BOOT_SERIAL_OUT_MAX*2];
|
||||
|
@ -325,7 +353,7 @@ void do_upload(char *filename){
|
|||
cbor_ensure_success(cbor_encoder_close_container(&root, &map));
|
||||
size_t cbor_size = cbor_encoder_get_buffer_size(&root, cbor_buf);
|
||||
|
||||
wrap_and_send_pkt(cbor_buf, cbor_size);
|
||||
wrap_and_send_pkt(cbor_buf, cbor_size, fast_mode);
|
||||
|
||||
uint8_t resp_buf[BOOT_SERIAL_IN_MAX*2];
|
||||
size_t in_len;
|
||||
|
@ -378,7 +406,7 @@ void fix_and_upload(char *filename) {
|
|||
if (version && !strcmp(version, "0.3.2.0") ) {
|
||||
// Upload bootloader update payload
|
||||
printf("Bootloader update required, uploading...\n");
|
||||
do_upload(NULL);
|
||||
do_upload(NULL, false);
|
||||
|
||||
// Reset into controller
|
||||
printf("Starting Controller\n");
|
||||
|
@ -398,7 +426,7 @@ void fix_and_upload(char *filename) {
|
|||
|
||||
// Do the update
|
||||
printf("Writing %s into slot 1\n", filename);
|
||||
do_upload(filename);
|
||||
do_upload(filename, image_get_fast_mode());
|
||||
}
|
||||
|
||||
void image_main(int fd, int argc, char **argv){
|
||||
|
|
|
@ -10,5 +10,6 @@
|
|||
#define IMAGE_LIST_CMD "\6\tAAsAAAABAAFCAKD1Mw==\n"
|
||||
|
||||
void image_main(int, int, char **);
|
||||
void image_set_fast_mode(void);
|
||||
|
||||
#endif //UMCUMGR_IMAGE_H
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <termios.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "image.h"
|
||||
#include "serial_util.h"
|
||||
|
@ -14,13 +15,17 @@ int main(int argc, char **argv) {
|
|||
int c;
|
||||
char *speed = NULL;
|
||||
char *serial_port = DEFAULT_SERIAL_PORT;
|
||||
while ((c = getopt(argc, argv, "c:s:")) != -1) {
|
||||
bool fast_mode = false;
|
||||
while ((c = getopt(argc, argv, "c:s:f")) != -1) {
|
||||
switch (c) {
|
||||
case 'c':
|
||||
serial_port = optarg;
|
||||
break;
|
||||
case 's':
|
||||
speed = optarg;
|
||||
case 'f':
|
||||
image_set_fast_mode();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include "serial_util.h"
|
||||
#include "error.h"
|
||||
|
||||
#define DEFAULT_SPEED B115200
|
||||
|
||||
|
@ -45,9 +46,8 @@ int serial_init(char const *serial_port, char const *speed) {
|
|||
int serial_fd = open(serial_port, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
if (serial_fd < 0) {
|
||||
fprintf(stderr, "Unable to open %s: %s\n", serial_port, strerror(errno));
|
||||
return 1;
|
||||
exit(ERR_SERIAL_PORT);
|
||||
}
|
||||
//printf("Opened %s\n", serial_port);
|
||||
|
||||
struct termios t_options;
|
||||
|
||||
|
|
Loading…
Reference in New Issue