.

Committer:
mbed_official
Date:
Fri Oct 06 03:00:39 2017 +0100
Revision:
27:d0b91bdc2f52
Parent:
24:8235ee7fff3d
Child:
34:bd38c669daa1
Print percent done to increase speed

Print percent done and only print it when the percent has changed.
This greatly increases flashing speed on devices with small page
size, such as the K64F with a reported page size of 24 bytes.

.
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 27:d0b91bdc2f52 56 uint32_t percent_done = 0;
mbed_official 0:8df79c088b12 57 while (true) {
mbed_official 0:8df79c088b12 58
mbed_official 0:8df79c088b12 59 // Read data for this page
mbed_official 0:8df79c088b12 60 memset(page_buffer, 0, sizeof(page_buffer));
mbed_official 0:8df79c088b12 61 int size_read = fread(page_buffer, 1, page_size, file);
mbed_official 0:8df79c088b12 62 if (size_read <= 0) {
mbed_official 0:8df79c088b12 63 break;
mbed_official 0:8df79c088b12 64 }
mbed_official 0:8df79c088b12 65
mbed_official 0:8df79c088b12 66 // Erase this page if it hasn't been erased
mbed_official 0:8df79c088b12 67 if (!sector_erased) {
mbed_official 0:8df79c088b12 68 flash.erase(addr, flash.get_sector_size(addr));
mbed_official 0:8df79c088b12 69 sector_erased = true;
mbed_official 0:8df79c088b12 70 }
mbed_official 0:8df79c088b12 71
mbed_official 0:8df79c088b12 72 // Program page
mbed_official 0:8df79c088b12 73 flash.program(page_buffer, addr, page_size);
mbed_official 0:8df79c088b12 74
mbed_official 0:8df79c088b12 75 addr += page_size;
mbed_official 0:8df79c088b12 76 if (addr >= next_sector) {
mbed_official 0:8df79c088b12 77 next_sector = addr + flash.get_sector_size(addr);
mbed_official 0:8df79c088b12 78 sector_erased = false;
mbed_official 24:8235ee7fff3d 79 }
mbed_official 0:8df79c088b12 80
mbed_official 24:8235ee7fff3d 81 if (++pages_flashed % 3 == 0) {
mbed_official 27:d0b91bdc2f52 82 uint32_t percent_done_new = ftell(file) * 100 / len;
mbed_official 27:d0b91bdc2f52 83 if (percent_done != percent_done_new) {
mbed_official 27:d0b91bdc2f52 84 percent_done = percent_done_new;
mbed_official 27:d0b91bdc2f52 85 printf("Flashed %3ld%%\r", percent_done);
mbed_official 27:d0b91bdc2f52 86 }
mbed_official 0:8df79c088b12 87 }
mbed_official 0:8df79c088b12 88 }
mbed_official 27:d0b91bdc2f52 89 printf("Flashed 100%%\r\n", ftell(file), len);
mbed_official 27:d0b91bdc2f52 90
mbed_official 0:8df79c088b12 91 delete[] page_buffer;
mbed_official 0:8df79c088b12 92
mbed_official 0:8df79c088b12 93 flash.deinit();
mbed_official 0:8df79c088b12 94 }