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) {
|
if (code < ERR_LAST) {
|
||||||
err_string = error_strings[code];
|
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);
|
exit(code);
|
||||||
}
|
}
|
|
@ -21,7 +21,7 @@ static int gpio_open(char const *gpio) {
|
||||||
sprintf(gpio_path, fmt_str, gpio);
|
sprintf(gpio_path, fmt_str, gpio);
|
||||||
int fd = open(gpio_path, O_WRONLY);
|
int fd = open(gpio_path, O_WRONLY);
|
||||||
if (fd < 0) {
|
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 -1;
|
||||||
}
|
}
|
||||||
return fd;
|
return fd;
|
||||||
|
@ -29,6 +29,9 @@ static int gpio_open(char const *gpio) {
|
||||||
|
|
||||||
void gpio_ble_reset(void) {
|
void gpio_ble_reset(void) {
|
||||||
int fd = gpio_open(EM_BLE_RESET_GPIO);
|
int fd = gpio_open(EM_BLE_RESET_GPIO);
|
||||||
|
if (fd < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (write(fd, "0", 1) < 1) {
|
if (write(fd, "0", 1) < 1) {
|
||||||
fprintf(stderr, "Failed to assert reset line\n");
|
fprintf(stderr, "Failed to assert reset line\n");
|
||||||
}
|
}
|
||||||
|
@ -45,6 +48,9 @@ void gpio_ble_reset(void) {
|
||||||
|
|
||||||
void gpio_ble_req_bootloader(void) {
|
void gpio_ble_req_bootloader(void) {
|
||||||
int fd = gpio_open(EM_BLE_REQ_GPIO);
|
int fd = gpio_open(EM_BLE_REQ_GPIO);
|
||||||
|
if (fd < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (write(fd, "0", 1) < 1) {
|
if (write(fd, "0", 1) < 1) {
|
||||||
fprintf(stderr, "Failed to assert bootloader_req\n");
|
fprintf(stderr, "Failed to assert bootloader_req\n");
|
||||||
}
|
}
|
||||||
|
|
48
src/image.c
48
src/image.c
|
@ -27,8 +27,14 @@
|
||||||
#include "sha256.h"
|
#include "sha256.h"
|
||||||
#endif
|
#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
|
* Larger values above greatly increase speed, but seem to break older
|
||||||
|
@ -40,6 +46,16 @@
|
||||||
|
|
||||||
static int serial_fd = -1;
|
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){
|
void image_help(void){
|
||||||
BAIL_OUT(ERR_USAGE);
|
BAIL_OUT(ERR_USAGE);
|
||||||
}
|
}
|
||||||
|
@ -191,7 +207,7 @@ static char *get_version(void) {
|
||||||
return version;
|
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(data != NULL);
|
||||||
assert(len != 0);
|
assert(len != 0);
|
||||||
static uint8_t seq = 67;
|
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 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, pos, to_write);
|
||||||
write(serial_fd, "\n", 1);
|
write(serial_fd, "\n", 1);
|
||||||
pos += to_write;
|
pos += to_write;
|
||||||
|
@ -244,7 +266,7 @@ static void wrap_and_send_pkt(uint8_t *data, size_t len) {
|
||||||
fsync(serial_fd);
|
fsync(serial_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_upload(char *filename){
|
void do_upload(char *filename, bool fast_mode){
|
||||||
serial_flush(serial_fd);
|
serial_flush(serial_fd);
|
||||||
size_t pos = 0, len;
|
size_t pos = 0, len;
|
||||||
uint8_t const *payload;
|
uint8_t const *payload;
|
||||||
|
@ -279,12 +301,18 @@ void do_upload(char *filename){
|
||||||
len = fixkey_payload_len;
|
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){
|
while (pos < len){
|
||||||
size_t data_chunk_len;
|
size_t data_chunk_len;
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
data_chunk_len = MACRO_CHUNK_SIZE;
|
data_chunk_len = base_chunk_len;
|
||||||
} else {
|
} else {
|
||||||
data_chunk_len = MACRO_CHUNK_SIZE + 45;
|
data_chunk_len = base_chunk_len + 45;
|
||||||
}
|
}
|
||||||
CborEncoder root, map;
|
CborEncoder root, map;
|
||||||
uint8_t cbor_buf[BOOT_SERIAL_OUT_MAX*2];
|
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));
|
cbor_ensure_success(cbor_encoder_close_container(&root, &map));
|
||||||
size_t cbor_size = cbor_encoder_get_buffer_size(&root, cbor_buf);
|
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];
|
uint8_t resp_buf[BOOT_SERIAL_IN_MAX*2];
|
||||||
size_t in_len;
|
size_t in_len;
|
||||||
|
@ -378,7 +406,7 @@ void fix_and_upload(char *filename) {
|
||||||
if (version && !strcmp(version, "0.3.2.0") ) {
|
if (version && !strcmp(version, "0.3.2.0") ) {
|
||||||
// Upload bootloader update payload
|
// Upload bootloader update payload
|
||||||
printf("Bootloader update required, uploading...\n");
|
printf("Bootloader update required, uploading...\n");
|
||||||
do_upload(NULL);
|
do_upload(NULL, false);
|
||||||
|
|
||||||
// Reset into controller
|
// Reset into controller
|
||||||
printf("Starting Controller\n");
|
printf("Starting Controller\n");
|
||||||
|
@ -398,7 +426,7 @@ void fix_and_upload(char *filename) {
|
||||||
|
|
||||||
// Do the update
|
// Do the update
|
||||||
printf("Writing %s into slot 1\n", filename);
|
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){
|
void image_main(int fd, int argc, char **argv){
|
||||||
|
|
|
@ -10,5 +10,6 @@
|
||||||
#define IMAGE_LIST_CMD "\6\tAAsAAAABAAFCAKD1Mw==\n"
|
#define IMAGE_LIST_CMD "\6\tAAsAAAABAAFCAKD1Mw==\n"
|
||||||
|
|
||||||
void image_main(int, int, char **);
|
void image_main(int, int, char **);
|
||||||
|
void image_set_fast_mode(void);
|
||||||
|
|
||||||
#endif //UMCUMGR_IMAGE_H
|
#endif //UMCUMGR_IMAGE_H
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "serial_util.h"
|
#include "serial_util.h"
|
||||||
|
@ -14,13 +15,17 @@ int main(int argc, char **argv) {
|
||||||
int c;
|
int c;
|
||||||
char *speed = NULL;
|
char *speed = NULL;
|
||||||
char *serial_port = DEFAULT_SERIAL_PORT;
|
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) {
|
switch (c) {
|
||||||
case 'c':
|
case 'c':
|
||||||
serial_port = optarg;
|
serial_port = optarg;
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
speed = optarg;
|
speed = optarg;
|
||||||
|
case 'f':
|
||||||
|
image_set_fast_mode();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include "serial_util.h"
|
#include "serial_util.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
#define DEFAULT_SPEED B115200
|
#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);
|
int serial_fd = open(serial_port, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||||
if (serial_fd < 0) {
|
if (serial_fd < 0) {
|
||||||
fprintf(stderr, "Unable to open %s: %s\n", serial_port, strerror(errno));
|
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;
|
struct termios t_options;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue