.

Committer:
mbed_official
Date:
Fri Sep 22 14:15:29 2017 +0100
Revision:
24:8235ee7fff3d
Parent:
14:9476f399341e
Child:
27:d0b91bdc2f52
Merge pull request #33 from janjongboom/patch-1

Add some feedback on stdout when flashing new binary
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-bootloader

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:8df79c088b12 1 #include "mbed.h"
mbed_official 0:8df79c088b12 2 #include "SDBlockDevice.h"
mbed_official 0:8df79c088b12 3 #include "FATFileSystem.h"
mbed_official 0:8df79c088b12 4
mbed_official 14:9476f399341e 5 #define SD_MOUNT_PATH "sd"
mbed_official 14:9476f399341e 6 #define FULL_UPDATE_FILE_PATH "/" SD_MOUNT_PATH "/" MBED_CONF_APP_UPDATE_FILE
mbed_official 14:9476f399341e 7
mbed_official 14:9476f399341e 8 //Pin order: MOSI, MISO, SCK, CS
mbed_official 14:9476f399341e 9 SDBlockDevice sd(MBED_CONF_APP_SD_CARD_MOSI, MBED_CONF_APP_SD_CARD_MISO,
mbed_official 14:9476f399341e 10 MBED_CONF_APP_SD_CARD_SCK, MBED_CONF_APP_SD_CARD_CS);
mbed_official 14:9476f399341e 11 FATFileSystem fs(SD_MOUNT_PATH);
mbed_official 0:8df79c088b12 12 FlashIAP flash;
mbed_official 0:8df79c088b12 13
mbed_official 0:8df79c088b12 14 void apply_update(FILE *file, uint32_t address);
mbed_official 0:8df79c088b12 15
mbed_official 0:8df79c088b12 16 int main()
mbed_official 0:8df79c088b12 17 {
mbed_official 0:8df79c088b12 18 sd.init();
mbed_official 0:8df79c088b12 19 fs.mount(&sd);
mbed_official 0:8df79c088b12 20
mbed_official 14:9476f399341e 21 FILE *file = fopen(FULL_UPDATE_FILE_PATH, "rb");
mbed_official 0:8df79c088b12 22 if (file != NULL) {
mbed_official 0:8df79c088b12 23 printf("Firmware update found\r\n");
mbed_official 0:8df79c088b12 24
mbed_official 0:8df79c088b12 25 apply_update(file, POST_APPLICATION_ADDR);
mbed_official 0:8df79c088b12 26
mbed_official 0:8df79c088b12 27 fclose(file);
mbed_official 14:9476f399341e 28 remove(FULL_UPDATE_FILE_PATH);
mbed_official 0:8df79c088b12 29 } else {
mbed_official 0:8df79c088b12 30 printf("No update found to apply\r\n");
mbed_official 0:8df79c088b12 31 }
mbed_official 0:8df79c088b12 32
mbed_official 0:8df79c088b12 33 fs.unmount();
mbed_official 0:8df79c088b12 34 sd.deinit();
mbed_official 0:8df79c088b12 35
mbed_official 0:8df79c088b12 36 printf("Starting application\r\n");
mbed_official 0:8df79c088b12 37
mbed_official 0:8df79c088b12 38 mbed_start_application(POST_APPLICATION_ADDR);
mbed_official 0:8df79c088b12 39 }
mbed_official 0:8df79c088b12 40
mbed_official 0:8df79c088b12 41 void apply_update(FILE *file, uint32_t address)
mbed_official 0:8df79c088b12 42 {
mbed_official 24:8235ee7fff3d 43 fseek(file, 0, SEEK_END);
mbed_official 24:8235ee7fff3d 44 long len = ftell(file);
mbed_official 24:8235ee7fff3d 45 printf("Firmware size is %ld bytes\r\n", len);
mbed_official 24:8235ee7fff3d 46 fseek(file, 0, SEEK_SET);
mbed_official 24:8235ee7fff3d 47
mbed_official 0:8df79c088b12 48 flash.init();
mbed_official 0:8df79c088b12 49
mbed_official 0:8df79c088b12 50 const uint32_t page_size = flash.get_page_size();
mbed_official 0:8df79c088b12 51 char *page_buffer = new char[page_size];
mbed_official 0:8df79c088b12 52 uint32_t addr = address;
mbed_official 0:8df79c088b12 53 uint32_t next_sector = addr + flash.get_sector_size(addr);
mbed_official 0:8df79c088b12 54 bool sector_erased = false;
mbed_official 24:8235ee7fff3d 55 size_t pages_flashed = 0;
mbed_official 0:8df79c088b12 56 while (true) {
mbed_official 0:8df79c088b12 57
mbed_official 0:8df79c088b12 58 // Read data for this page
mbed_official 0:8df79c088b12 59 memset(page_buffer, 0, sizeof(page_buffer));
mbed_official 0:8df79c088b12 60 int size_read = fread(page_buffer, 1, page_size, file);
mbed_official 0:8df79c088b12 61 if (size_read <= 0) {
mbed_official 0:8df79c088b12 62 break;
mbed_official 0:8df79c088b12 63 }
mbed_official 0:8df79c088b12 64
mbed_official 0:8df79c088b12 65 // Erase this page if it hasn't been erased
mbed_official 0:8df79c088b12 66 if (!sector_erased) {
mbed_official 0:8df79c088b12 67 flash.erase(addr, flash.get_sector_size(addr));
mbed_official 0:8df79c088b12 68 sector_erased = true;
mbed_official 0:8df79c088b12 69 }
mbed_official 0:8df79c088b12 70
mbed_official 0:8df79c088b12 71 // Program page
mbed_official 0:8df79c088b12 72 flash.program(page_buffer, addr, page_size);
mbed_official 0:8df79c088b12 73
mbed_official 0:8df79c088b12 74 addr += page_size;
mbed_official 0:8df79c088b12 75 if (addr >= next_sector) {
mbed_official 0:8df79c088b12 76 next_sector = addr + flash.get_sector_size(addr);
mbed_official 0:8df79c088b12 77 sector_erased = false;
mbed_official 24:8235ee7fff3d 78 }
mbed_official 0:8df79c088b12 79
mbed_official 24:8235ee7fff3d 80 if (++pages_flashed % 3 == 0) {
mbed_official 24:8235ee7fff3d 81 printf("Flashed %ld / %ld bytes\r\n", ftell(file), len);
mbed_official 0:8df79c088b12 82 }
mbed_official 0:8df79c088b12 83 }
mbed_official 0:8df79c088b12 84 delete[] page_buffer;
mbed_official 0:8df79c088b12 85
mbed_official 0:8df79c088b12 86 flash.deinit();
mbed_official 0:8df79c088b12 87 }