1
0
Fork 0

Adds in optional fast_mode for later c3w bootloaders

This commit is contained in:
Shawn Nock 2019-06-18 14:44:47 -04:00
parent f1f64667f3
commit 50f987eb48
6 changed files with 55 additions and 15 deletions

View File

@ -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);
} }

View File

@ -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");
} }

View File

@ -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){

View File

@ -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

View File

@ -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;
} }

View File

@ -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;