diff --git a/firmware/Makefile b/firmware/Makefile index 09a5b3c22..2048d430f 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,4 +1,11 @@ +ifeq ($(FASTFLASH),1) +APPVER = 2.0.0 + +OBJS += fastflash.o +OBJS += bootloader.o +else APPVER = 1.0.0 +endif NAME = trezor @@ -59,6 +66,10 @@ OBJS += protob/types.pb.o include ../Makefile.include +ifeq ($(FASTFLASH),1) +CFLAGS += -DFASTFLASH +endif + CFLAGS += -Wno-sequence-point CFLAGS += -Iprotob -DPB_FIELD_16BIT=1 CFLAGS += -DQR_MAX_VERSION=0 diff --git a/firmware/fastflash.c b/firmware/fastflash.c new file mode 100644 index 000000000..85aef6ffb --- /dev/null +++ b/firmware/fastflash.c @@ -0,0 +1,47 @@ +/* + * This file is part of the TREZOR project. + * + * Copyright (C) 2017 Saleem Rashid + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#include "fastflash.h" + +#include +#include +#include + +#include + +extern uint32_t __bootloader_loadaddr__[]; +extern uint32_t __bootloader_runaddr__[]; +extern uint8_t __bootloader_size__[]; + +void load_bootloader() { + memcpy(__bootloader_runaddr__, __bootloader_loadaddr__, (size_t) __bootloader_size__); +} + +void run_bootloader() { + // Relocate vector tables + SCB_VTOR = (uint32_t) __bootloader_runaddr__; + + // Set stack pointer + __asm__ volatile("msr msp, %0":: "r" (__bootloader_runaddr__[0])); + + // Jump to address + ((void (*)(void))(__bootloader_runaddr__[1]))(); + + while (true); +} diff --git a/firmware/fastflash.h b/firmware/fastflash.h new file mode 100644 index 000000000..20caf1ef7 --- /dev/null +++ b/firmware/fastflash.h @@ -0,0 +1,26 @@ +/* + * This file is part of the TREZOR project. + * + * Copyright (C) 2017 Saleem Rashid + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#ifndef __FASTFLASH_H__ +#define __FASTFLASH_H__ + +void load_bootloader(void); +void __attribute__((noreturn)) run_bootloader(void); + +#endif diff --git a/firmware/trezor.c b/firmware/trezor.c index 87c192852..d9febae6c 100644 --- a/firmware/trezor.c +++ b/firmware/trezor.c @@ -29,6 +29,7 @@ #include "rng.h" #include "timer.h" #include "buttons.h" +#include "fastflash.h" uint32_t __stack_chk_guard; @@ -98,6 +99,14 @@ int main(void) __stack_chk_guard = random32(); // this supports compiler provided unpredictable stack protection checks #endif +#if FASTFLASH + uint16_t state = gpio_port_read(BTN_PORT); + if ((state & BTN_PIN_NO) == 0) { + load_bootloader(); + run_bootloader(); + } +#endif + timer_init(); #if DEBUG_LINK diff --git a/memory_app_2.0.0.ld b/memory_app_2.0.0.ld new file mode 100644 index 000000000..f846f1728 --- /dev/null +++ b/memory_app_2.0.0.ld @@ -0,0 +1,21 @@ +/* STM32F205RE - 512K Flash, 128K RAM */ +/* program starts at 0x08010000 */ +MEMORY +{ + rom (rx) : ORIGIN = 0x08010000, LENGTH = 512K - 64K + bootloader (rx) : ORIGIN = 0x20000000, LENGTH = __bootloader_size__ + ram (rwx) : ORIGIN = ORIGIN(bootloader) + LENGTH(bootloader), + LENGTH = 128K - LENGTH(bootloader) +} + +INCLUDE libopencm3_stm32f2.ld + +SECTIONS +{ + .bootloader : { + __bootloader_runaddr__ = .; + KEEP (*(.bootloader*)) + } >bootloader AT >rom + + __bootloader_loadaddr__ = LOADADDR(.bootloader); +}