mbed-os-examples
/
mbed-os-example-mbed5-bootloader
.
main.cpp@27:d0b91bdc2f52, 2017-10-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |