From 01de6a74c503669d819e6f4e3b1b2b228178d040 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 29 May 2012 10:07:23 +0900 Subject: [PATCH] DFU support for reGNUal upgrade --- ChangeLog | 7 +++++++ boards/CQ_STARM/board.h | 1 - boards/FST_01/board.h | 1 - boards/FST_01_00/board.h | 1 - boards/OLIMEX_STM32_H103/board.h | 1 - boards/STBEE/board.h | 1 - boards/STBEE_MINI/board.h | 1 - boards/STM32_PRIMER2/board.h | 1 - boards/STM8S_DISCOVERY/board.h | 1 - src/config.h.in | 1 + src/configure | 1 + src/flash.c | 5 ----- src/gnuk.ld.in | 1 + src/main.c | 25 ++++++++++++++++++++++++- src/sys.c | 1 + 15 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 730b58e..7181adc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-05-29 Niibe Yutaka + * src/main.c (main) [DFU_SUPPORT]: Kill DFU and install .sys. + + * src/config.h.in (FLASH_PAGE_SIZE): New. + * src/configure: Support FLASH_PAGE_SIZE for config.h + * boards/*/board.h (FLASH_PAGE_SIZE): Remove. + * src/flash.c (FLASH_PAGE_SIZE): Remove. + * src/sys.c (reset): Don't depend if DFU_SUPPORT or not. (flash_erase_all_and_exec): Rename and change the argument. * src/gnuk.ld.in (__flash_start__): Real flash ROM address, diff --git a/boards/CQ_STARM/board.h b/boards/CQ_STARM/board.h index c9d1443..5268912 100644 --- a/boards/CQ_STARM/board.h +++ b/boards/CQ_STARM/board.h @@ -34,7 +34,6 @@ #define SET_LED_CONDITION(on) on /* To emit light, call palSetPad */ #define GPIO_LED GPIOC_LED #define IOPORT_LED GPIOC -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/boards/FST_01/board.h b/boards/FST_01/board.h index a8332f3..cf911a3 100644 --- a/boards/FST_01/board.h +++ b/boards/FST_01/board.h @@ -36,7 +36,6 @@ #define IOPORT_USB GPIOA #define GPIO_LED GPIOB_LED #define IOPORT_LED GPIOB -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/boards/FST_01_00/board.h b/boards/FST_01_00/board.h index 59c4531..5428bcf 100644 --- a/boards/FST_01_00/board.h +++ b/boards/FST_01_00/board.h @@ -36,7 +36,6 @@ #define IOPORT_USB GPIOA #define GPIO_LED GPIOA_LED #define IOPORT_LED GPIOA -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/boards/OLIMEX_STM32_H103/board.h b/boards/OLIMEX_STM32_H103/board.h index 1e7df8d..a6c2d84 100644 --- a/boards/OLIMEX_STM32_H103/board.h +++ b/boards/OLIMEX_STM32_H103/board.h @@ -36,7 +36,6 @@ #define IOPORT_USB GPIOC #define GPIO_LED GPIOC_LED #define IOPORT_LED GPIOC -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/boards/STBEE/board.h b/boards/STBEE/board.h index 1e75f11..75a3f41 100644 --- a/boards/STBEE/board.h +++ b/boards/STBEE/board.h @@ -37,7 +37,6 @@ #define IOPORT_USB GPIOD #define GPIO_LED GPIOD_LED1 #define IOPORT_LED GPIOD -#define FLASH_PAGE_SIZE 2048 /* * Board identifier. diff --git a/boards/STBEE_MINI/board.h b/boards/STBEE_MINI/board.h index da19e1d..da3adae 100644 --- a/boards/STBEE_MINI/board.h +++ b/boards/STBEE_MINI/board.h @@ -37,7 +37,6 @@ #define IOPORT_USB GPIOA #define GPIO_LED GPIOA_LED1 #define IOPORT_LED GPIOA -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/boards/STM32_PRIMER2/board.h b/boards/STM32_PRIMER2/board.h index 89f79c4..0991242 100644 --- a/boards/STM32_PRIMER2/board.h +++ b/boards/STM32_PRIMER2/board.h @@ -36,7 +36,6 @@ #define IOPORT_USB GPIOD #define GPIO_LED GPIOE_LEDR #define IOPORT_LED GPIOE -#define FLASH_PAGE_SIZE 2048 /* * Board identifier. diff --git a/boards/STM8S_DISCOVERY/board.h b/boards/STM8S_DISCOVERY/board.h index a9cb272..f352bc1 100644 --- a/boards/STM8S_DISCOVERY/board.h +++ b/boards/STM8S_DISCOVERY/board.h @@ -36,7 +36,6 @@ #define SET_LED_CONDITION(on) on /* To emit light, call palSetPad */ #define GPIO_LED GPIOA_LED #define IOPORT_LED GPIOA -#define FLASH_PAGE_SIZE 1024 /* * Board identifier. diff --git a/src/config.h.in b/src/config.h.in index 37fbb30..cb61d1b 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -6,3 +6,4 @@ @PINPAD_DEFINE@ @PINPAD_MORE_DEFINE@ @CERTDO_DEFINE@ +#define FLASH_PAGE_SIZE @FLASH_PAGE_SIZE@ diff --git a/src/configure b/src/configure index 25ddd0e..d170a00 100755 --- a/src/configure +++ b/src/configure @@ -238,5 +238,6 @@ sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \ -e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \ -e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \ -e "s/@CERTDO_DEFINE@/$CERTDO_DEFINE/" \ + -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \ < config.h.in > config.h exit 0 diff --git a/src/flash.c b/src/flash.c index 76b98a2..78ebdb1 100644 --- a/src/flash.c +++ b/src/flash.c @@ -56,11 +56,6 @@ * 1.5-KiB Key store (512-byte (p, q and N) key-store * 3) */ #define FLASH_DATA_POOL_HEADER_SIZE 2 -#if defined(STM32F10X_HD) -#define FLASH_PAGE_SIZE 2048 -#else -#define FLASH_PAGE_SIZE 1024 -#endif #define FLASH_DATA_POOL_SIZE (FLASH_PAGE_SIZE*2) #define FLASH_KEYSTORE_SIZE (512*3) diff --git a/src/gnuk.ld.in b/src/gnuk.ld.in index 3d4f675..bd57af7 100644 --- a/src/gnuk.ld.in +++ b/src/gnuk.ld.in @@ -52,6 +52,7 @@ SECTIONS .sys : ALIGN(16) SUBALIGN(16) { + _sys = .; KEEP(*(.vectors)) sys.o(.text) sys.o(.text.*) diff --git a/src/main.c b/src/main.c index aa1344b..d935fb0 100644 --- a/src/main.c +++ b/src/main.c @@ -483,8 +483,31 @@ main (int argc, char *argv[]) port_disable (); /* Set vector */ SCB->VTOR = (uint32_t)&_regnual_start; - /* Leave Gnuk */ +#ifdef DFU_SUPPORT +#define FLASH_SYS_START_ADDR 0x08000000 +#define FLASH_SYS_END_ADDR (0x08000000+0x1000) + { + extern uint8_t _sys; + uint32_t addr; + handler *new_vector = (handler *)FLASH_SYS_START_ADDR; + void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[10]; + + /* Kill DFU */ + for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR; + addr += FLASH_PAGE_SIZE) + flash_erase_page (addr); + + /* copy system service routines */ + flash_write (FLASH_SYS_START_ADDR, &_sys, 0x1000); + + /* Leave Gnuk to exec reGNUal */ + (*func) (*((void (**)(void))(&_regnual_start+4))); + for (;;); + } +#else + /* Leave Gnuk to exec reGNUal */ flash_erase_all_and_exec (*((void (**)(void))(&_regnual_start+4))); +#endif /* Never reached */ return 0; diff --git a/src/sys.c b/src/sys.c index f69d0c2..2c71b99 100644 --- a/src/sys.c +++ b/src/sys.c @@ -21,6 +21,7 @@ * */ +#include "config.h" #include "ch.h" #include "hal.h" #include "board.h"