.
Dependencies: mbed EthernetInterface mbed-rtos
Fork of Bootloader_K64F by
Bootloader/bootloader.h
- Committer:
- Sissors
- Date:
- 2016-04-23
- Revision:
- 7:4ab0430d06e3
- Child:
- 8:00cefe0d59ed
File content as of revision 7:4ab0430d06e3:
#define START_ADDRESS 0x80000 #define NUM_SECTORS 120 #define SECTOR_SIZE 4096 #define BUFFER_SIZE 16 #define TIMEOUT 10000000 int *(*program_flash_boot)(int, char*, unsigned int) = (int *(*)(int, char*, unsigned int))0x795C9; int *(*erase_sector_boot)(int) = (int *(*)(int))0x79465; void *(*bootloader)(int) = (void *(*)(int))0x79121; 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++; } } void write_flash(void) { __disable_irq(); printf("Erasing flash!\r\n"); for (int i = 0; i < NUM_SECTORS; i++) erase_sector_boot(START_ADDRESS + i * SECTOR_SIZE); char buffer[BUFFER_SIZE]; uint32_t count = 0; uint8_t buffercount = 0; uint32_t timeout = 0; //Wait until data is sent while(!(UART0->S1 & UART_S1_RDRF_MASK)); //Data receive loop while(1) { //Check if there is new data if (UART0->S1 & UART_S1_RDRF_MASK) { //Place data in buffer buffer[buffercount] = UART0->D; buffercount++; //Reset timeout timeout = 0; //We write per BUFFER_SIZE chars if (buffercount == BUFFER_SIZE) { //NMI Handler is at bytes 8-9-10-11, we overwrite this to point to bootloader function //Program the buffer into the flash memory if (program_flash_boot(count+START_ADDRESS, buffer, BUFFER_SIZE) != 0) { write("Error!\r\n"); break; } //Reset buffercount for next buffer write("#"); buffercount = 0; count += BUFFER_SIZE; } } else { //No new data, increase timeout timeout++; //We have received no new data for a while, assume we are done if (timeout > TIMEOUT) { //If there is data left in the buffer, program it if (buffercount != 0) { for (int i = buffercount; i<BUFFER_SIZE; i++) { buffer[i] = 0xFF; } program_flash_boot(count+START_ADDRESS, buffer, BUFFER_SIZE); count += BUFFER_SIZE; } break; //We should be done programming :D } } } printf("Done writing\r\n"); printf("Size = %d - %X\r\n", count, count); bootloader(count); }