.

Committer:
mbed_official
Date:
Wed Nov 20 14:01:42 2019 +0000
Revision:
71:f65271241611
Parent:
36:e521117bf688
Merge pull request #125 from amq/patch-1

Fix a compiler warning
.
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 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 71:f65271241611 64 memset(page_buffer, 0, sizeof(char) * page_size);
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 36:e521117bf688 93 printf("Flashed 100%%\r\n");
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 }