Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed EthernetInterface mbed-rtos
Fork of FOTA_K64F by
FreescaleIAP/bootloader.cpp
- Committer:
- Sissors
- Date:
- 2016-04-24
- Revision:
- 10:fb5121bcc468
- Child:
- 11:0f4df7636ef7
File content as of revision 10:fb5121bcc468:
#include "mbed.h"
#include "FreescaleIAP.h"
//Could be nicer, but for now just erase all preceding sectors
#define NUM_SECTORS 120
#define TIMEOUT 10000000
#define BUFFER_SIZE 16
void setupserial();
void write(char *value);
__attribute__((section(".ARM.__at_0x79120"))) void bootloader(int size)
{
SysTick->CTRL = 0;
__disable_irq();
setupserial();
write("\n\n\rBootloader\r\n");
//Erase all sectors we use for the user program
write("Erasing sectors!\r\n");
for (int i = 0; i<NUM_SECTORS; i++) {
write("*");
erase_sector(SECTOR_SIZE * i);
}
write("Done erasing, reading file!\r\n");
char buffer[BUFFER_SIZE];
char *source = (char*)0x80000;
//Data receive loop
for(int count = 0; count<size; count+=BUFFER_SIZE) {
for (int i = 0; i<BUFFER_SIZE; i++)
buffer[i] = source[i+count];
if (program_flash(count, buffer, BUFFER_SIZE) != 0) {
write("Error!\r\n");
break;
}
//Reset buffercount for next buffer
write("%");
}
write("Done programming!\r\n");
NVIC_SystemReset();
//Shouldn't arrive here
while(1);
}
__attribute__((section(".ARM.__at_0x79120"))) static void setupserial(void) {
//Setup USBTX/USBRX pins (PTB16/PTB17)
SIM->SCGC5 |= 1 << SIM_SCGC5_PORTB_SHIFT;
PORTB->PCR[16] = (PORTB->PCR[16] & 0x700) | (3 << 8);
PORTB->PCR[17] = (PORTB->PCR[17] & 0x700) | (3 << 8);
//Setup UART (ugly, copied resulting values from mbed serial setup)
SIM->SCGC4 |= SIM_SCGC4_UART0_MASK;
UART0->BDH = 3;
UART0->BDL = 13;
UART0->C4 = 8;
UART0->C2 = 12; //Enables UART
}
__attribute__((section(".ARM.__at_0x79120"))) static void write(char *value)
{
int i = 0;
//Loop through string and send everything
while(*(value+i) != '\0') {
while(!(UART0->S1 & UART_S1_TDRE_MASK));
UART0->D = *(value+i);
i++;
}
}
