1
0
Fork 0

Integrates fixkey workflow into the normal update workflow

Normal upload via umcumgr can update the bootloader if needed without additional steps.
This commit is contained in:
Shawn Nock 2019-06-04 12:20:14 -04:00
parent d1a1717af9
commit 10b9f33142
1 changed files with 19 additions and 11 deletions

View File

@ -122,6 +122,7 @@ static void cbor_require_type(CborValue *it, CborType type) {
}
static char *get_version(void) {
serial_flush(serial_fd);
int rc = write(serial_fd, IMAGE_LIST_CMD, sizeof(IMAGE_LIST_CMD) - 1);
if (rc < sizeof(IMAGE_LIST_CMD) - 1) {
fprintf(stderr, "Failed to send command: %s\n", strerror(errno));
@ -188,9 +189,6 @@ static char *get_version(void) {
cbor_value_dup_text_string(&version_tag, &version, &len, NULL);
break;
}
if (!version) {
printf("No applicaiton image found\n");
}
free(decoded_buf);
return version;
}
@ -247,6 +245,7 @@ static void wrap_and_send_pkt(uint8_t *data, size_t len) {
}
void do_upload(char *filename){
serial_flush(serial_fd);
size_t pos = 0, len;
uint8_t const *payload;
if (filename) {
@ -259,11 +258,13 @@ void do_upload(char *filename){
struct stat st;
fstat(fd, &st);
len = st.st_size;
uint8_t *payload_mut = calloc(1, len);
if (!payload_mut) {
fprintf(stderr, "Failed alloc %s:%d", __FILE__, __LINE__);
exit(9);
}
size_t bytes_read = 0;
while (bytes_read < len) {
errno = 0;
@ -375,28 +376,30 @@ void do_upload(char *filename){
pos += actual_size;
free(out);
}
printf("\nSuccess.\n");
exit(0);
printf("\n");
}
void fix_and_upload(char *filename) {
char *version = get_version();
if (!strcmp(version, "0.3.2.0") ) {
if (version && !strcmp(version, "0.3.2.0") ) {
// Upload bootloader update payload
printf("Bootloader update required, uploading...\n");
do_upload(NULL);
// Reset into controller
printf("Starting Controller\n");
gpio_ble_req_controller();
sleep(1);
// Update bootloader
printf("Triggering bootloader upgrade\n");
write(serial_fd, fixkey_msg, sizeof(fixkey_msg));
if (fsync(serial_fd) < 0) {
fprintf(stderr, "fsync of serial device failed.\n");
}
sleep(3);
// Reset into new bootloader
printf("Reseting into new bootloader\n");
gpio_ble_req_bootloader();
usleep(50000);
}
// Do the update
@ -413,8 +416,13 @@ void image_main(int fd, int argc, char **argv){
}
if (!strcmp(argv[0], "version")) {
char *version = get_version();
printf("%s\n", version);
free(version);
if (version) {
printf("%s\n", version);
free(version);
} else {
printf("No application image found.\n");
}
} else if (!strcmp(argv[0], "upload")) {
if (argc < 2) {
fprintf(stderr, "umcumgr image upload <binary file>\n");