.

Committer:
mbed_official
Date:
Tue Jun 06 10:45:20 2017 +0100
Revision:
11:d396becb5d76
Parent:
0:8df79c088b12
Child:
14:9476f399341e
Merge pull request #9 from 0xc0170/fix_config_update_file

Config used for update file path
.
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 0:8df79c088b12 5 SDBlockDevice sd(D11, D12, D13, D10);
mbed_official 0:8df79c088b12 6 FATFileSystem fs("sd");
mbed_official 0:8df79c088b12 7 FlashIAP flash;
mbed_official 0:8df79c088b12 8
mbed_official 0:8df79c088b12 9 void apply_update(FILE *file, uint32_t address);
mbed_official 0:8df79c088b12 10
mbed_official 0:8df79c088b12 11 int main()
mbed_official 0:8df79c088b12 12 {
mbed_official 0:8df79c088b12 13 sd.init();
mbed_official 0:8df79c088b12 14 fs.mount(&sd);
mbed_official 0:8df79c088b12 15
mbed_official 11:d396becb5d76 16 FILE *file = fopen(MBED_CONF_APP_UPDATE_FILE, "rb");
mbed_official 0:8df79c088b12 17 if (file != NULL) {
mbed_official 0:8df79c088b12 18 printf("Firmware update found\r\n");
mbed_official 0:8df79c088b12 19
mbed_official 0:8df79c088b12 20 apply_update(file, POST_APPLICATION_ADDR);
mbed_official 0:8df79c088b12 21
mbed_official 0:8df79c088b12 22 fclose(file);
mbed_official 11:d396becb5d76 23 remove(MBED_CONF_APP_UPDATE_FILE);
mbed_official 0:8df79c088b12 24 } else {
mbed_official 0:8df79c088b12 25 printf("No update found to apply\r\n");
mbed_official 0:8df79c088b12 26 }
mbed_official 0:8df79c088b12 27
mbed_official 0:8df79c088b12 28 fs.unmount();
mbed_official 0:8df79c088b12 29 sd.deinit();
mbed_official 0:8df79c088b12 30
mbed_official 0:8df79c088b12 31 printf("Starting application\r\n");
mbed_official 0:8df79c088b12 32
mbed_official 0:8df79c088b12 33 mbed_start_application(POST_APPLICATION_ADDR);
mbed_official 0:8df79c088b12 34 }
mbed_official 0:8df79c088b12 35
mbed_official 0:8df79c088b12 36 void apply_update(FILE *file, uint32_t address)
mbed_official 0:8df79c088b12 37 {
mbed_official 0:8df79c088b12 38 flash.init();
mbed_official 0:8df79c088b12 39
mbed_official 0:8df79c088b12 40 const uint32_t page_size = flash.get_page_size();
mbed_official 0:8df79c088b12 41 char *page_buffer = new char[page_size];
mbed_official 0:8df79c088b12 42 uint32_t addr = address;
mbed_official 0:8df79c088b12 43 uint32_t next_sector = addr + flash.get_sector_size(addr);
mbed_official 0:8df79c088b12 44 bool sector_erased = false;
mbed_official 0:8df79c088b12 45 while (true) {
mbed_official 0:8df79c088b12 46
mbed_official 0:8df79c088b12 47 // Read data for this page
mbed_official 0:8df79c088b12 48 memset(page_buffer, 0, sizeof(page_buffer));
mbed_official 0:8df79c088b12 49 int size_read = fread(page_buffer, 1, page_size, file);
mbed_official 0:8df79c088b12 50 if (size_read <= 0) {
mbed_official 0:8df79c088b12 51 break;
mbed_official 0:8df79c088b12 52 }
mbed_official 0:8df79c088b12 53
mbed_official 0:8df79c088b12 54 // Erase this page if it hasn't been erased
mbed_official 0:8df79c088b12 55 if (!sector_erased) {
mbed_official 0:8df79c088b12 56 flash.erase(addr, flash.get_sector_size(addr));
mbed_official 0:8df79c088b12 57 sector_erased = true;
mbed_official 0:8df79c088b12 58 }
mbed_official 0:8df79c088b12 59
mbed_official 0:8df79c088b12 60 // Program page
mbed_official 0:8df79c088b12 61 flash.program(page_buffer, addr, page_size);
mbed_official 0:8df79c088b12 62
mbed_official 0:8df79c088b12 63 addr += page_size;
mbed_official 0:8df79c088b12 64 if (addr >= next_sector) {
mbed_official 0:8df79c088b12 65 next_sector = addr + flash.get_sector_size(addr);
mbed_official 0:8df79c088b12 66 sector_erased = false;
mbed_official 0:8df79c088b12 67
mbed_official 0:8df79c088b12 68 }
mbed_official 0:8df79c088b12 69 }
mbed_official 0:8df79c088b12 70 delete[] page_buffer;
mbed_official 0:8df79c088b12 71
mbed_official 0:8df79c088b12 72 flash.deinit();
mbed_official 0:8df79c088b12 73 }