mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-29 05:21:37 +03:00
Add eboot
This commit is contained in:
86
bootloaders/eboot/eboot.c
Normal file
86
bootloaders/eboot/eboot.c
Normal file
@ -0,0 +1,86 @@
|
||||
/* Copyright (c) 2015 Ivan Grokhotkov. All rights reserved.
|
||||
* This file is part of eboot bootloader.
|
||||
*
|
||||
* Redistribution and use is permitted according to the conditions of the
|
||||
* 3-clause BSD license to be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "eboot.h"
|
||||
extern void* flashchip;
|
||||
|
||||
#define SWRST do { (*((volatile uint32_t*) 0x60000700)) |= 0x80000000; } while(0);
|
||||
|
||||
|
||||
int load_app_from_flash_raw(const uint32_t flash_addr)
|
||||
{
|
||||
image_header_t image_header;
|
||||
uint32_t pos = flash_addr + APP_START_OFFSET;
|
||||
|
||||
if (SPIRead(pos, &image_header, sizeof(image_header))) {
|
||||
return 1;
|
||||
}
|
||||
pos += sizeof(image_header);
|
||||
|
||||
|
||||
for (uint32_t section_index = 0;
|
||||
section_index < image_header.num_segments;
|
||||
++section_index)
|
||||
{
|
||||
section_header_t section_header = {0};
|
||||
if (SPIRead(pos, §ion_header, sizeof(section_header))) {
|
||||
return 2;
|
||||
}
|
||||
pos += sizeof(section_header);
|
||||
|
||||
const uint32_t address = section_header.address;
|
||||
|
||||
bool load = false;
|
||||
|
||||
if (address < 0x40000000) {
|
||||
load = true;
|
||||
}
|
||||
|
||||
if (address >= 0x40100000 && address < 0x40108000) {
|
||||
load = true;
|
||||
}
|
||||
|
||||
if (address >= 0x60000000) {
|
||||
load = true;
|
||||
}
|
||||
|
||||
if (!load) {
|
||||
pos += section_header.size;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SPIRead(pos, (void*)address, section_header.size))
|
||||
return 3;
|
||||
|
||||
pos += section_header.size;
|
||||
}
|
||||
|
||||
register uint32_t sp asm("a1") = 0x3ffffff0;
|
||||
register uint32_t pc asm("a3") = image_header.entry;
|
||||
__asm__ __volatile__ ("jx a3");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
int res = load_app_from_flash_raw(0);
|
||||
if (res) {
|
||||
ets_putc('\n');
|
||||
ets_putc('#');
|
||||
ets_putc('0' + res);
|
||||
ets_putc('\n');
|
||||
SWRST;
|
||||
}
|
||||
|
||||
while(true){}
|
||||
}
|
Reference in New Issue
Block a user