mbed-os-examples
/
mbed-os-example-mbed5-bootloader
.
main.cpp@34:bd38c669daa1, 2017-12-12 (annotated)
- Committer:
- mbed_official
- Date:
- Tue Dec 12 16:30:15 2017 +0000
- Revision:
- 34:bd38c669daa1
- Parent:
- 27:d0b91bdc2f52
- Child:
- 36:e521117bf688
Error if restrict_size is not set in json
If the target override restrict_size is not set in targets.json then
trigger an error when compiling. This gives a clear error message
to users rather than failing with only linker errors.
.
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 | 34:bd38c669daa1 | 8 | #if !defined(POST_APPLICATION_ADDR) |
mbed_official | 34:bd38c669daa1 | 9 | #error "target.restrict_size must be set for your target in mbed_app.json" |
mbed_official | 34:bd38c669daa1 | 10 | #endif |
mbed_official | 34:bd38c669daa1 | 11 | |
mbed_official | 14:9476f399341e | 12 | //Pin order: MOSI, MISO, SCK, CS |
mbed_official | 14:9476f399341e | 13 | SDBlockDevice sd(MBED_CONF_APP_SD_CARD_MOSI, MBED_CONF_APP_SD_CARD_MISO, |
mbed_official | 14:9476f399341e | 14 | MBED_CONF_APP_SD_CARD_SCK, MBED_CONF_APP_SD_CARD_CS); |
mbed_official | 14:9476f399341e | 15 | FATFileSystem fs(SD_MOUNT_PATH); |
mbed_official | 0:8df79c088b12 | 16 | FlashIAP flash; |
mbed_official | 0:8df79c088b12 | 17 | |
mbed_official | 0:8df79c088b12 | 18 | void apply_update(FILE *file, uint32_t address); |
mbed_official | 0:8df79c088b12 | 19 | |
mbed_official | 0:8df79c088b12 | 20 | int main() |
mbed_official | 0:8df79c088b12 | 21 | { |
mbed_official | 0:8df79c088b12 | 22 | sd.init(); |
mbed_official | 0:8df79c088b12 | 23 | fs.mount(&sd); |
mbed_official | 0:8df79c088b12 | 24 | |
mbed_official | 14:9476f399341e | 25 | FILE *file = fopen(FULL_UPDATE_FILE_PATH, "rb"); |
mbed_official | 0:8df79c088b12 | 26 | if (file != NULL) { |
mbed_official | 0:8df79c088b12 | 27 | printf("Firmware update found\r\n"); |
mbed_official | 0:8df79c088b12 | 28 | |
mbed_official | 0:8df79c088b12 | 29 | apply_update(file, POST_APPLICATION_ADDR); |
mbed_official | 0:8df79c088b12 | 30 | |
mbed_official | 0:8df79c088b12 | 31 | fclose(file); |
mbed_official | 14:9476f399341e | 32 | remove(FULL_UPDATE_FILE_PATH); |
mbed_official | 0:8df79c088b12 | 33 | } else { |
mbed_official | 0:8df79c088b12 | 34 | printf("No update found to apply\r\n"); |
mbed_official | 0:8df79c088b12 | 35 | } |
mbed_official | 0:8df79c088b12 | 36 | |
mbed_official | 0:8df79c088b12 | 37 | fs.unmount(); |
mbed_official | 0:8df79c088b12 | 38 | sd.deinit(); |
mbed_official | 0:8df79c088b12 | 39 | |
mbed_official | 0:8df79c088b12 | 40 | printf("Starting application\r\n"); |
mbed_official | 0:8df79c088b12 | 41 | |
mbed_official | 0:8df79c088b12 | 42 | mbed_start_application(POST_APPLICATION_ADDR); |
mbed_official | 0:8df79c088b12 | 43 | } |
mbed_official | 0:8df79c088b12 | 44 | |
mbed_official | 0:8df79c088b12 | 45 | void apply_update(FILE *file, uint32_t address) |
mbed_official | 0:8df79c088b12 | 46 | { |
mbed_official | 24:8235ee7fff3d | 47 | fseek(file, 0, SEEK_END); |
mbed_official | 24:8235ee7fff3d | 48 | long len = ftell(file); |
mbed_official | 24:8235ee7fff3d | 49 | printf("Firmware size is %ld bytes\r\n", len); |
mbed_official | 24:8235ee7fff3d | 50 | fseek(file, 0, SEEK_SET); |
mbed_official | 24:8235ee7fff3d | 51 | |
mbed_official | 0:8df79c088b12 | 52 | flash.init(); |
mbed_official | 0:8df79c088b12 | 53 | |
mbed_official | 0:8df79c088b12 | 54 | const uint32_t page_size = flash.get_page_size(); |
mbed_official | 0:8df79c088b12 | 55 | char *page_buffer = new char[page_size]; |
mbed_official | 0:8df79c088b12 | 56 | uint32_t addr = address; |
mbed_official | 0:8df79c088b12 | 57 | uint32_t next_sector = addr + flash.get_sector_size(addr); |
mbed_official | 0:8df79c088b12 | 58 | bool sector_erased = false; |
mbed_official | 24:8235ee7fff3d | 59 | size_t pages_flashed = 0; |
mbed_official | 27:d0b91bdc2f52 | 60 | uint32_t percent_done = 0; |
mbed_official | 0:8df79c088b12 | 61 | while (true) { |
mbed_official | 0:8df79c088b12 | 62 | |
mbed_official | 0:8df79c088b12 | 63 | // Read data for this page |
mbed_official | 0:8df79c088b12 | 64 | memset(page_buffer, 0, sizeof(page_buffer)); |
mbed_official | 0:8df79c088b12 | 65 | int size_read = fread(page_buffer, 1, page_size, file); |
mbed_official | 0:8df79c088b12 | 66 | if (size_read <= 0) { |
mbed_official | 0:8df79c088b12 | 67 | break; |
mbed_official | 0:8df79c088b12 | 68 | } |
mbed_official | 0:8df79c088b12 | 69 | |
mbed_official | 0:8df79c088b12 | 70 | // Erase this page if it hasn't been erased |
mbed_official | 0:8df79c088b12 | 71 | if (!sector_erased) { |
mbed_official | 0:8df79c088b12 | 72 | flash.erase(addr, flash.get_sector_size(addr)); |
mbed_official | 0:8df79c088b12 | 73 | sector_erased = true; |
mbed_official | 0:8df79c088b12 | 74 | } |
mbed_official | 0:8df79c088b12 | 75 | |
mbed_official | 0:8df79c088b12 | 76 | // Program page |
mbed_official | 0:8df79c088b12 | 77 | flash.program(page_buffer, addr, page_size); |
mbed_official | 0:8df79c088b12 | 78 | |
mbed_official | 0:8df79c088b12 | 79 | addr += page_size; |
mbed_official | 0:8df79c088b12 | 80 | if (addr >= next_sector) { |
mbed_official | 0:8df79c088b12 | 81 | next_sector = addr + flash.get_sector_size(addr); |
mbed_official | 0:8df79c088b12 | 82 | sector_erased = false; |
mbed_official | 24:8235ee7fff3d | 83 | } |
mbed_official | 0:8df79c088b12 | 84 | |
mbed_official | 24:8235ee7fff3d | 85 | if (++pages_flashed % 3 == 0) { |
mbed_official | 27:d0b91bdc2f52 | 86 | uint32_t percent_done_new = ftell(file) * 100 / len; |
mbed_official | 27:d0b91bdc2f52 | 87 | if (percent_done != percent_done_new) { |
mbed_official | 27:d0b91bdc2f52 | 88 | percent_done = percent_done_new; |
mbed_official | 27:d0b91bdc2f52 | 89 | printf("Flashed %3ld%%\r", percent_done); |
mbed_official | 27:d0b91bdc2f52 | 90 | } |
mbed_official | 0:8df79c088b12 | 91 | } |
mbed_official | 0:8df79c088b12 | 92 | } |
mbed_official | 27:d0b91bdc2f52 | 93 | printf("Flashed 100%%\r\n", ftell(file), len); |
mbed_official | 27:d0b91bdc2f52 | 94 | |
mbed_official | 0:8df79c088b12 | 95 | delete[] page_buffer; |
mbed_official | 0:8df79c088b12 | 96 | |
mbed_official | 0:8df79c088b12 | 97 | flash.deinit(); |
mbed_official | 0:8df79c088b12 | 98 | } |