.

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