From eb588f1aec0da2d0b5a8bf61533f1180b46e5644 Mon Sep 17 00:00:00 2001 From: Salvatore Pitrulli Date: Mon, 21 Mar 2011 13:11:52 +0100 Subject: [PATCH] New HAL and SimpleMAC for STM32W108. --- cpu/stm32w108/Makefile.stm32w108 | 17 +- cpu/stm32w108/cfs-coffee-arch.h | 9 +- cpu/stm32w108/dev/stm32w_conf.h | 4 +- cpu/stm32w108/dev/stm32w_systick.c | 2 +- cpu/stm32w108/dev/stm32w_systick.h | 2 +- cpu/stm32w108/dev/stm32w_type.h | 80 - cpu/stm32w108/dev/uart1.h.bak | 53 + .../{hal/micro/cortexm3 => }/e_stdio/Makefile | 0 .../cortexm3 => }/e_stdio/src/_SP_printf.c | 0 .../cortexm3 => }/e_stdio/src/_SP_puts.c | 0 .../cortexm3 => }/e_stdio/src/_SP_snprintf.c | 0 .../cortexm3 => }/e_stdio/src/_SP_sprintf.c | 0 .../cortexm3 => }/e_stdio/src/_SP_vfprintf.c | 0 .../micro/cortexm3 => }/e_stdio/src/floatio.h | 0 .../micro/cortexm3 => }/e_stdio/src/fvwrite.h | 0 .../micro/cortexm3 => }/e_stdio/src/local.h | 0 .../micro/cortexm3 => }/e_stdio/src/mbctype.h | 0 .../micro/cortexm3 => }/e_stdio/src/scanf.c | 0 .../cortexm3 => }/e_stdio/src/small_dtoa.c | 0 .../cortexm3 => }/e_stdio/src/small_mprec.c | 0 .../cortexm3 => }/e_stdio/src/small_mprec.h | 0 .../cortexm3 => }/e_stdio/src/small_strtod.c | 0 .../e_stdio/src/small_vfsscanf.c | 0 .../cortexm3 => }/e_stdio/src/small_wcrtomb.c | 0 .../e_stdio/src/small_wcsrtombs.c | 0 .../e_stdio/src/small_wctomb_r.c | 0 .../micro/cortexm3 => }/e_stdio/src/sscanf.c | 0 .../micro/cortexm3 => }/e_stdio/src/swi.h | 0 .../cortexm3 => }/e_stdio/src/syscalls.c | 0 .../micro/cortexm3 => }/e_stdio/src/test.c | 0 .../cortexm3 => }/e_stdio/src/test_mes.c | 0 .../cortexm3 => }/e_stdio/src/test_printf.c | 0 .../cortexm3 => }/e_stdio/src/test_scanf.c | 0 .../cortexm3 => }/e_stdio/src/vfieeefp.h | 0 cpu/stm32w108/gnu.ld | 236 +++ cpu/stm32w108/hal/doxygen/Doxygen_Release | 1557 ----------------- cpu/stm32w108/hal/doxygen/STFooterHTML.html | 18 - cpu/stm32w108/hal/doxygen/STHeaderHTML.html | 16 - cpu/stm32w108/hal/doxygen/ST_Logo.gif | Bin 1123 -> 0 bytes cpu/stm32w108/hal/doxygen/makefile | 5 - cpu/stm32w108/hal/error-def.h | 2 +- cpu/stm32w108/hal/hal.h | 3 +- cpu/stm32w108/hal/micro/adc.h | 10 +- cpu/stm32w108/hal/micro/cortexm3/adc.c | 1 + cpu/stm32w108/hal/micro/cortexm3/board.c | 453 +++++ cpu/stm32w108/hal/micro/cortexm3/button.c | 23 +- .../hal/micro/cortexm3/compiler/gnu.h | 32 +- .../hal/micro/cortexm3/compiler/iar.h | 19 + .../hal/micro/cortexm3/iap_bootloader.h | 34 + cpu/stm32w108/hal/micro/cortexm3/led.c | 14 +- cpu/stm32w108/hal/micro/cortexm3/memmap.h | 2 + .../micro/cortexm3/micro-common-internal.c | 2 +- .../hal/micro/cortexm3/micro-common.c | 16 +- .../hal/micro/cortexm3/micro-common.h | 27 +- cpu/stm32w108/hal/micro/cortexm3/micro.c | 47 + cpu/stm32w108/hal/micro/cortexm3/nvm.c | 25 + cpu/stm32w108/hal/micro/cortexm3/spmr.s79 | 6 +- .../hal/micro/cortexm3/stm32w108/board.h | 248 ++- .../micro/cortexm3/stm32w108/crt_stm32w108.c | 37 +- .../hal/micro/cortexm3/stm32w108/gnu.ld | 129 +- .../hal/micro/cortexm3/stm32w108/iar-cfg.icf | 19 +- .../micro/cortexm3/stm32w108/low_level_init.c | 29 + .../hal/micro/cortexm3/stm32w108/regs.h | 3 + .../hal/micro/cortexm3/temperature_sensor.c | 16 +- .../micro/generic/compiler/platform-common.h | 12 - cpu/stm32w108/hal/micro/led.h | 13 +- cpu/stm32w108/hal/micro/micro-common.h | 31 + cpu/stm32w108/hal/micro/system-timer.h | 4 +- cpu/stm32w108/hal/micro/temperature_sensor.h | 2 +- .../stm32w108 => }/iar-cfg-coffee.icf | 22 +- cpu/stm32w108/iar-cfg.icf | 39 + .../cortexm3 => lib}/e_stdio_intonly_thumb2.a | Bin .../micro/cortexm3 => lib}/e_stdio_thumb2.a | Bin .../cortexm3 => lib}/smallprintf_thumb2.a | Bin cpu/stm32w108/simplemac/include/phy-library.h | 3 +- .../simplemac/library/simplemac-library-gnu.a | Bin 0 -> 166656 bytes .../simplemac/library/simplemac-library-iar.a | Bin 125778 -> 0 bytes .../simplemac/library/simplemac-library.a | Bin 132816 -> 98640 bytes .../micro/cortexm3 => }/small_printf/Makefile | 0 .../cortexm3 => }/small_printf/_SP_printf.c | 0 .../cortexm3 => }/small_printf/_SP_puts.c | 0 .../cortexm3 => }/small_printf/_SP_snprintf.c | 0 .../cortexm3 => }/small_printf/_SP_sprintf.c | 0 .../cortexm3 => }/small_printf/_SP_vfprintf.c | 0 .../cortexm3 => }/small_printf/vfieeefp.h | 0 platform/mb851/Makefile.mb851 | 2 +- platform/mb851/board-mb851.c | 47 + platform/mb851/dev/button-sensor.c | 12 + platform/mb851/dev/temperature-sensor.c | 3 + 89 files changed, 1503 insertions(+), 1883 deletions(-) delete mode 100644 cpu/stm32w108/dev/stm32w_type.h create mode 100644 cpu/stm32w108/dev/uart1.h.bak rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/Makefile (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/_SP_printf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/_SP_puts.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/_SP_snprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/_SP_sprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/_SP_vfprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/floatio.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/fvwrite.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/local.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/mbctype.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/scanf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_dtoa.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_mprec.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_mprec.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_strtod.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_vfsscanf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_wcrtomb.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_wcsrtombs.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/small_wctomb_r.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/sscanf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/swi.h (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/syscalls.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/test.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/test_mes.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/test_printf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/test_scanf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/e_stdio/src/vfieeefp.h (100%) create mode 100644 cpu/stm32w108/gnu.ld delete mode 100644 cpu/stm32w108/hal/doxygen/Doxygen_Release delete mode 100644 cpu/stm32w108/hal/doxygen/STFooterHTML.html delete mode 100644 cpu/stm32w108/hal/doxygen/STHeaderHTML.html delete mode 100644 cpu/stm32w108/hal/doxygen/ST_Logo.gif delete mode 100644 cpu/stm32w108/hal/doxygen/makefile create mode 100644 cpu/stm32w108/hal/micro/cortexm3/board.c create mode 100644 cpu/stm32w108/hal/micro/cortexm3/iap_bootloader.h rename cpu/stm32w108/{hal/micro/cortexm3/stm32w108 => }/iar-cfg-coffee.icf (76%) create mode 100644 cpu/stm32w108/iar-cfg.icf rename cpu/stm32w108/{hal/micro/cortexm3 => lib}/e_stdio_intonly_thumb2.a (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => lib}/e_stdio_thumb2.a (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => lib}/smallprintf_thumb2.a (100%) create mode 100644 cpu/stm32w108/simplemac/library/simplemac-library-gnu.a delete mode 100644 cpu/stm32w108/simplemac/library/simplemac-library-iar.a rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/Makefile (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/_SP_printf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/_SP_puts.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/_SP_snprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/_SP_sprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/_SP_vfprintf.c (100%) rename cpu/stm32w108/{hal/micro/cortexm3 => }/small_printf/vfieeefp.h (100%) create mode 100644 platform/mb851/board-mb851.c diff --git a/cpu/stm32w108/Makefile.stm32w108 b/cpu/stm32w108/Makefile.stm32w108 index 56fd72891..247b00595 100644 --- a/cpu/stm32w108/Makefile.stm32w108 +++ b/cpu/stm32w108/Makefile.stm32w108 @@ -45,9 +45,9 @@ ifdef IAR TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a else ifdef PRINTF_FLOAT - TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a + TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a else - TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_intonly_thumb2.a + TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/lib/e_stdio_intonly_thumb2.a endif endif # `$(CC) -print-file-name=thumb2/libc.a` `$(CC) -print-file-name=thumb2/libgcc.a` @@ -74,7 +74,7 @@ AROPTS = --create ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR) LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map ifndef COFFEE - LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg.icf + LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg.icf endif OBJOPTS = --bin @@ -101,7 +101,7 @@ ASFLAGS = -mthumb -mcpu=cortex-m3 -fsigned-char -c -g -Wall -Os -ffunction-secti -mlittle-endian -fshort-enums -x assembler-with-cpp -Wa,-EL LDFLAGS += -mcpu=cortex-m3 \ -mthumb \ - -Wl,-T -Xlinker $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/gnu.ld \ + -Wl,-T -Xlinker $(CONTIKI_CPU)/gnu.ld \ -Wl,-static \ -u Default_Handler \ -nostartfiles \ @@ -118,8 +118,6 @@ OBJOPTS = -O binary endif -ifndef IAR - ifdef COFFEE_ADDRESS COFFEE = 1 endif @@ -147,15 +145,18 @@ ifeq ($(COFFEE),1) else # Coffee starts at the end of the flash, before NVM section. - COFFEE_ADDRESS = 0x801F400 + COFFEE_ADDRESS = 0x801F800 endif + +ifndef IAR + LDFLAGS+= -Wl,--section-start=.coffee=$(COFFEE_ADDRESS) else #IAR ifeq ($(COFFEE),1) - LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf + LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg-coffee.icf endif endif diff --git a/cpu/stm32w108/cfs-coffee-arch.h b/cpu/stm32w108/cfs-coffee-arch.h index 51cba54cd..e529b0123 100644 --- a/cpu/stm32w108/cfs-coffee-arch.h +++ b/cpu/stm32w108/cfs-coffee-arch.h @@ -67,7 +67,7 @@ /* If using IAR, COFFEE_ADDRESS reflects the static value in the linker script iar-cfg-coffee.icf, so it can't be passed as a parameter for Make.*/ #ifdef __ICCARM__ -#define COFFEE_ADDRESS 0x8010000 +#define COFFEE_ADDRESS 0x8010c00 #endif #if (COFFEE_ADDRESS & 0x3FF) !=0 #error "COFFEE_ADDRESS not aligned to a 1024-bytes page boundary." @@ -96,9 +96,10 @@ #define COFFEE_LOG_SIZE 128 // COFFEE_MICRO_LOGS is 0. -#if COFFEE_PAGES <= 0x100 -#define coffee_page_t uint8_t -#elif COFFEE_PAGES <= 0x10000 +#if COFFEE_PAGES <= 127 +#define coffee_page_t int8_t +#elif COFFEE_PAGES <= 0x7FFF +#define coffee_page_t int16_t #endif diff --git a/cpu/stm32w108/dev/stm32w_conf.h b/cpu/stm32w108/dev/stm32w_conf.h index c7b64e64c..84aa3d6ec 100644 --- a/cpu/stm32w108/dev/stm32w_conf.h +++ b/cpu/stm32w108/dev/stm32w_conf.h @@ -1,5 +1,5 @@ /******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : stm32f10x_conf.h +* File Name : stm32w_conf.h * Author : MCD Application Team * Version : V2.0.3 * Date : 09/22/2008 @@ -18,7 +18,7 @@ #define __STM32F10x_CONF_H /* Includes ------------------------------------------------------------------*/ -#include "stm32w_type.h" +#include "stm32w108_type.h" /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ diff --git a/cpu/stm32w108/dev/stm32w_systick.c b/cpu/stm32w108/dev/stm32w_systick.c index 11c3a2f6a..de34f8c44 100644 --- a/cpu/stm32w108/dev/stm32w_systick.c +++ b/cpu/stm32w108/dev/stm32w_systick.c @@ -1,5 +1,5 @@ /******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : stm32f10x_systick.c +* File Name : stm32w108_systick.c * Author : MCD Application Team * Version : V2.0.3 * Date : 09/22/2008 diff --git a/cpu/stm32w108/dev/stm32w_systick.h b/cpu/stm32w108/dev/stm32w_systick.h index c9ca99176..415be6429 100644 --- a/cpu/stm32w108/dev/stm32w_systick.h +++ b/cpu/stm32w108/dev/stm32w_systick.h @@ -18,7 +18,7 @@ #ifndef __STM32W_SYSTICK_H #define __STM32W_SYSTICK_H -#include "stm32w_type.h" +#include "stm32w108_type.h" #include "stm32w_conf.h" #ifndef EXT diff --git a/cpu/stm32w108/dev/stm32w_type.h b/cpu/stm32w108/dev/stm32w_type.h deleted file mode 100644 index e3a5fda06..000000000 --- a/cpu/stm32w108/dev/stm32w_type.h +++ /dev/null @@ -1,80 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : stm32f10x_type.h -* Author : MCD Application Team -* Version : V2.0.3 -* Date : 09/22/2008 -* Description : This file contains all the common data types used for the -* STM32F10x firmware library. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_TYPE_H -#define __STM32F10x_TYPE_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef signed long s32; -typedef signed short s16; -typedef signed char s8; - -typedef signed long const sc32; /* Read Only */ -typedef signed short const sc16; /* Read Only */ -typedef signed char const sc8; /* Read Only */ - -typedef volatile signed long vs32; -typedef volatile signed short vs16; -typedef volatile signed char vs8; - -typedef volatile signed long const vsc32; /* Read Only */ -typedef volatile signed short const vsc16; /* Read Only */ -typedef volatile signed char const vsc8; /* Read Only */ - -typedef unsigned long u32; -typedef unsigned short u16; -typedef unsigned char u8; - -typedef unsigned long const uc32; /* Read Only */ -typedef unsigned short const uc16; /* Read Only */ -typedef unsigned char const uc8; /* Read Only */ - -typedef volatile unsigned long vu32; -typedef volatile unsigned short vu16; -typedef volatile unsigned char vu8; - -typedef volatile unsigned long const vuc32; /* Read Only */ -typedef volatile unsigned short const vuc16; /* Read Only */ -typedef volatile unsigned char const vuc8; /* Read Only */ - -//typedef enum {FALSE = 0, TRUE = !FALSE} bool; - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; - -#define U8_MAX ((u8)255) -#define S8_MAX ((s8)127) -#define S8_MIN ((s8)-128) -#define U16_MAX ((u16)65535u) -#define S16_MAX ((s16)32767) -#define S16_MIN ((s16)-32768) -#define U32_MAX ((u32)4294967295uL) -#define S32_MAX ((s32)2147483647) -#define S32_MIN ((s32)-2147483648) - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __STM32F10x_TYPE_H */ - -/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ diff --git a/cpu/stm32w108/dev/uart1.h.bak b/cpu/stm32w108/dev/uart1.h.bak new file mode 100644 index 000000000..22f741290 --- /dev/null +++ b/cpu/stm32w108/dev/uart1.h.bak @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * $Id: uart1.h,v 1.1 2010/10/25 09:03:39 salvopitru Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __UART1_H__ +#define __UART1_H__ + +//#include "msp430.h" +// +//#define UART1_BAUD2UBR(baud) ((MSP430_CPU_SPEED)/(baud)) + +void uart1_set_input(int (*input)(unsigned char c)); +void uart1_writeb(unsigned char c); +void uart1_init(unsigned long ubr); +//uint8_t uart1_active(void); + +#endif /* __UART1_H__ */ diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/Makefile b/cpu/stm32w108/e_stdio/Makefile similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/Makefile rename to cpu/stm32w108/e_stdio/Makefile diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_printf.c b/cpu/stm32w108/e_stdio/src/_SP_printf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_printf.c rename to cpu/stm32w108/e_stdio/src/_SP_printf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_puts.c b/cpu/stm32w108/e_stdio/src/_SP_puts.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_puts.c rename to cpu/stm32w108/e_stdio/src/_SP_puts.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_snprintf.c b/cpu/stm32w108/e_stdio/src/_SP_snprintf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_snprintf.c rename to cpu/stm32w108/e_stdio/src/_SP_snprintf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_sprintf.c b/cpu/stm32w108/e_stdio/src/_SP_sprintf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_sprintf.c rename to cpu/stm32w108/e_stdio/src/_SP_sprintf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_vfprintf.c b/cpu/stm32w108/e_stdio/src/_SP_vfprintf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/_SP_vfprintf.c rename to cpu/stm32w108/e_stdio/src/_SP_vfprintf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/floatio.h b/cpu/stm32w108/e_stdio/src/floatio.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/floatio.h rename to cpu/stm32w108/e_stdio/src/floatio.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/fvwrite.h b/cpu/stm32w108/e_stdio/src/fvwrite.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/fvwrite.h rename to cpu/stm32w108/e_stdio/src/fvwrite.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/local.h b/cpu/stm32w108/e_stdio/src/local.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/local.h rename to cpu/stm32w108/e_stdio/src/local.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/mbctype.h b/cpu/stm32w108/e_stdio/src/mbctype.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/mbctype.h rename to cpu/stm32w108/e_stdio/src/mbctype.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/scanf.c b/cpu/stm32w108/e_stdio/src/scanf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/scanf.c rename to cpu/stm32w108/e_stdio/src/scanf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_dtoa.c b/cpu/stm32w108/e_stdio/src/small_dtoa.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_dtoa.c rename to cpu/stm32w108/e_stdio/src/small_dtoa.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_mprec.c b/cpu/stm32w108/e_stdio/src/small_mprec.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_mprec.c rename to cpu/stm32w108/e_stdio/src/small_mprec.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_mprec.h b/cpu/stm32w108/e_stdio/src/small_mprec.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_mprec.h rename to cpu/stm32w108/e_stdio/src/small_mprec.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_strtod.c b/cpu/stm32w108/e_stdio/src/small_strtod.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_strtod.c rename to cpu/stm32w108/e_stdio/src/small_strtod.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_vfsscanf.c b/cpu/stm32w108/e_stdio/src/small_vfsscanf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_vfsscanf.c rename to cpu/stm32w108/e_stdio/src/small_vfsscanf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wcrtomb.c b/cpu/stm32w108/e_stdio/src/small_wcrtomb.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wcrtomb.c rename to cpu/stm32w108/e_stdio/src/small_wcrtomb.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wcsrtombs.c b/cpu/stm32w108/e_stdio/src/small_wcsrtombs.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wcsrtombs.c rename to cpu/stm32w108/e_stdio/src/small_wcsrtombs.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wctomb_r.c b/cpu/stm32w108/e_stdio/src/small_wctomb_r.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/small_wctomb_r.c rename to cpu/stm32w108/e_stdio/src/small_wctomb_r.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/sscanf.c b/cpu/stm32w108/e_stdio/src/sscanf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/sscanf.c rename to cpu/stm32w108/e_stdio/src/sscanf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/swi.h b/cpu/stm32w108/e_stdio/src/swi.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/swi.h rename to cpu/stm32w108/e_stdio/src/swi.h diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/syscalls.c b/cpu/stm32w108/e_stdio/src/syscalls.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/syscalls.c rename to cpu/stm32w108/e_stdio/src/syscalls.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test.c b/cpu/stm32w108/e_stdio/src/test.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test.c rename to cpu/stm32w108/e_stdio/src/test.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_mes.c b/cpu/stm32w108/e_stdio/src/test_mes.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_mes.c rename to cpu/stm32w108/e_stdio/src/test_mes.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_printf.c b/cpu/stm32w108/e_stdio/src/test_printf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_printf.c rename to cpu/stm32w108/e_stdio/src/test_printf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_scanf.c b/cpu/stm32w108/e_stdio/src/test_scanf.c similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/test_scanf.c rename to cpu/stm32w108/e_stdio/src/test_scanf.c diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/vfieeefp.h b/cpu/stm32w108/e_stdio/src/vfieeefp.h similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio/src/vfieeefp.h rename to cpu/stm32w108/e_stdio/src/vfieeefp.h diff --git a/cpu/stm32w108/gnu.ld b/cpu/stm32w108/gnu.ld new file mode 100644 index 000000000..58d9df2b8 --- /dev/null +++ b/cpu/stm32w108/gnu.ld @@ -0,0 +1,236 @@ +/*SEARCH_DIR("C:\Program Files\Raisonance\Ride\Lib\ARM") +EXTERN( __io_putchar ) +EXTERN( _write ) +GROUP( +"std_sbrk_thumb.lib" +"smallprintf_thumb.a" +"libc.a" +"libm.a" +) +*/ +/* default stack sizes. + +These are used by the startup in order to allocate stacks for the different modes. +*/ + +__Stack_Size = 0x500 ; + +PROVIDE ( _Stack_Size = __Stack_Size ) ; + +__Stack_Init = 0x20000000; + +_estack = __Stack_Init + __Stack_Size; + + +/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/ +PROVIDE ( _Stack_Init = __Stack_Init ) ; + +/* +this sends all unreferenced IRQHandlers to a Default_Handler or a reset. +*/ + +PROVIDE(Default_Handler = 0 ); +PROVIDE(NMI_Handler = Default_Handler ); +PROVIDE(HardFault_Handler = Default_Handler ); +PROVIDE(MemManage_Handler = Default_Handler ); +PROVIDE(BusFault_Handler = Default_Handler ); +PROVIDE(UsageFault_Handler = Default_Handler ); +PROVIDE(SVC_Handler = Default_Handler ); +PROVIDE(DebugMonitor_Handler = Default_Handler ); +PROVIDE(PendSV_Handler = Default_Handler ); +PROVIDE(SysTick_Handler = Default_Handler ); +PROVIDE(halTimer1Isr = Default_Handler ); +PROVIDE(halTimer2Isr = Default_Handler ); +PROVIDE(halManagementIsr = Default_Handler ); +PROVIDE(halBaseBandIsr = Default_Handler ); +PROVIDE(halSleepTimerIsr = Default_Handler ); +PROVIDE(halSc1Isr = Default_Handler ); +PROVIDE(halSc2Isr = Default_Handler ); +PROVIDE(halSecurityIsr = Default_Handler ); +PROVIDE(halStackMacTimerIsr = Default_Handler ); +PROVIDE(stmRadioTransmitIsr = Default_Handler ); +PROVIDE(stmRadioReceiveIsr = Default_Handler ); +PROVIDE(halAdcIsr = Default_Handler ); +PROVIDE(halIrqAIsr = Default_Handler ); +PROVIDE(halIrqBIsr = Default_Handler ); +PROVIDE(halIrqCIsr = Default_Handler ); +PROVIDE(halIrqDIsr = Default_Handler ); +PROVIDE(halDebugIsr = Default_Handler ); + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/*this allows to compile the ST lib in "non-debug" mode*/ +_BOOTLOADER_SIZE = 0x3000 ; +_ROM_base = DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000 ; +/* include the memory spaces definitions sub-script */ +MEMORY +{ + RAM_region (xrw) : ORIGIN = 0x20000000, LENGTH = 8K + ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-2K + NVM_region (rx) : ORIGIN = 0x0801F800, LENGTH = 2K + FIB_region (ra) : ORIGIN = 0x08040000, LENGTH = 2K +} + + +/* Sections management for FLASH mode */ + +/* Sections Definitions */ + +SECTIONS +{ + + /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */ + + .isr_vector (DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000) : + { + . = ALIGN(4); + __ApplicationFlashStart = . ; + /* . = . + _ROM_base ;*/ + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >ROM_region + + /* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */ + .flashtext : + { + . = ALIGN(4); + *(.flashtext) /* Startup code */ + . = ALIGN(4); + } >ROM_region + + /* the program code is stored in the .text section, which goes to Flash */ + .text : + { + . = ALIGN(4); + + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + . = (DEFINED(ELF_LOADER) ? ALIGN(1024) : .); + *(.elf_text) + . = (DEFINED(ELF_LOADER) ? ALIGN(1024) : .); + + . = ALIGN(4); + _etext = .; + /* This is used by the startup in order to initialize the .data section */ + _sidata = _etext; + } >ROM_region + + /* Section start can be overridden via command line. */ + .coffee 0x08010c0 : + { + _coffee_start = ABSOLUTE(.); + . = ALIGN(1024); + *(.coffeefiles) + . = ORIGIN(NVM_region) - _coffee_start; + } > ROM_region = 0x00 + + + NVM (NOLOAD): + { + . = ALIGN(1024); + KEEP(*(NVM)) + . = ALIGN(4); + } > NVM_region + + + FAT (NOLOAD) : + { + . = ALIGN(4); + KEEP(*(FAT)) + . = ALIGN(4); + } > FIB_region + + /* after that it's only debugging information. */ + + + /* This is the initialized data section + The program executes knowing that the data is in the RAM + but the loader puts the initial values in the FLASH (inidata). + It is one task of the startup to copy the initial values from FLASH to RAM. */ + .data _estack : AT ( _sidata ) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data section */ + _sdata = . ; + + *(.data) + *(.data.*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + ASSERT(_sidata + SIZEOF(.data) < LOADADDR(.coffee), ".data section overflow in ROM"); + } >RAM_region + + + /* This is the uninitialized data section */ + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + } >RAM_region + + PROVIDE ( end = _ebss ); + PROVIDE ( _end = _ebss ); + + __exidx_start = .; + __exidx_end = .; + + /* remove the debugging information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} + +__ApplicationFlashEnd = _sidata + (_edata - _sdata); diff --git a/cpu/stm32w108/hal/doxygen/Doxygen_Release b/cpu/stm32w108/hal/doxygen/Doxygen_Release deleted file mode 100644 index bd72919f3..000000000 --- a/cpu/stm32w108/hal/doxygen/Doxygen_Release +++ /dev/null @@ -1,1557 +0,0 @@ -# Doxyfile 1.6.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = "Hardware Abstraction Layer" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 1.0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = . - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = /Users/dimitri/doxygen/mail/1.5.7/doxywizard/ - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set -# FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ../ - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */hal_test/* - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = STHeaderHTML.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = STFooterHTML.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's -# filter section matches. -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# When the SEARCHENGINE tag is enable doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. - -SEARCHENGINE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/cpu/stm32w108/hal/doxygen/STFooterHTML.html b/cpu/stm32w108/hal/doxygen/STFooterHTML.html deleted file mode 100644 index 4f4cad439..000000000 --- a/cpu/stm32w108/hal/doxygen/STFooterHTML.html +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - - -
-$projectname.
-$projectnumber. -
-
-
-Copyright © 2009 by STMicrolectronics. All rights reserved.
-Generated $datetime with Doxygen $doxygenversion. -
-
- - \ No newline at end of file diff --git a/cpu/stm32w108/hal/doxygen/STHeaderHTML.html b/cpu/stm32w108/hal/doxygen/STHeaderHTML.html deleted file mode 100644 index 76acc6ee9..000000000 --- a/cpu/stm32w108/hal/doxygen/STHeaderHTML.html +++ /dev/null @@ -1,16 +0,0 @@ - - -$title - - - - - - -
-Home  - |  Modules  - |  Data Structures  - |  File List  - |  Index
-
diff --git a/cpu/stm32w108/hal/doxygen/ST_Logo.gif b/cpu/stm32w108/hal/doxygen/ST_Logo.gif deleted file mode 100644 index 1b401a59c210c025b0d39e787b1eaae51bffd654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmWlXQD|K?7{^aXiyyOvDAO8kaVx`_BC<%7vZoVWikeuMd+Tc00J27A>qy2N4`xWV-035-cKd3cZ_yUcYci#`w+h%m$%B3ON`1EGd!LntFU%S)j|Oo@PTmSBV;P7wk1wYG#Rq7|Wlm08J_ zh$<0j98<3BHJtK!?t>@B6P9F|&%MsG;PcE|Pn0K6mzmcYEBLbZ+&HeB3@)TjN~Dld z$RI-OLM&KtOd^GeoxyGFm~jRx8B$0lq!Ek>X0Tp|n3`Cdn6g+iqa`NjkZLKBR7xrX zWkEBEqy|0H20f$FP{t@TG_OBAHl;Y^iOCZloJ}2d4FyKQP@5+zPb4Jb)uEszM^eeDw3J!RIFcIlpbdJU zQc(t!DVo=RXsoaUSz@w;TW1T7bEM#0a4Wz%;7Fm+gHz~1a3uf)AeH7At8GDZj-;GZ zZYfv|97z>=&+!?K{4jQ)fClrIdd3=x-Lp62Pn*wG7T&#ep8Wax=UcvQX}oZI@XF-fr~TQR zw^yep_gr89;PmLhAJ3(0E5AI})pH;^a(7|o&gA?%CtvIPrztLW{Q7m@jrE7_Wh1@U zqRrKhFaG=Z4@=u>n|k&8rl(=*#^HYc?8NVIDqm^$~J0FHa;mF1P7dB=Getzb^ knaW_t@%OIWIdSs07gowT4E=rY!S diff --git a/cpu/stm32w108/hal/hal.h b/cpu/stm32w108/hal/hal.h index e0fb7bbe7..e0161af3a 100644 --- a/cpu/stm32w108/hal/hal.h +++ b/cpu/stm32w108/hal/hal.h @@ -31,13 +31,12 @@ // Keep micro first for specifics used by other headers #include "micro/micro-common.h" -#include "micro/cortexm3/micro-common.h" - #include "micro/led.h" #include "micro/button.h" #include "micro/system-timer.h" #include "micro/cortexm3/nvm.h" #include "hal/micro/cortexm3/uart.h" +#include "hal/micro/adc.h" #endif //__HAL_H__ diff --git a/cpu/stm32w108/hal/micro/adc.h b/cpu/stm32w108/hal/micro/adc.h index 76fe07de4..9f690c58a 100644 --- a/cpu/stm32w108/hal/micro/adc.h +++ b/cpu/stm32w108/hal/micro/adc.h @@ -15,8 +15,7 @@ * * To use the ADC system, include this file and ensure that * ::halInternalInitAdc() is called whenever the microcontroller is - * started. Call ::halInternalSleepAdc() to sleep the module and - * ::halInternalInitAdc() to wake up the module. + * started. * * A "user" is a separate thread of execution and usage. That is, * internal St code is one user and clients are a different user. @@ -171,13 +170,6 @@ typedef int8u ADCChannelType; */ void halInternalInitAdc(void); - -/** @brief Shuts down the voltage reference and ADC system to - * minimize power consumption in sleep. - */ -void halInternalSleepAdc(void); - - /** @brief Starts an ADC conversion for the user specified by \c id. * * @appusage The application must set \c reference to the voltage diff --git a/cpu/stm32w108/hal/micro/cortexm3/adc.c b/cpu/stm32w108/hal/micro/cortexm3/adc.c index 79e017f6c..9185ecd4f 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/adc.c +++ b/cpu/stm32w108/hal/micro/cortexm3/adc.c @@ -117,6 +117,7 @@ ADCUser startNextConversion() ADC_CFG = adcConfig[i]; // set the configuration to desired INT_ADCFLAG = 0xFFFF; INT_CFGSET = INT_ADC; + break; //see DDTS MBTst38936 } } } else { diff --git a/cpu/stm32w108/hal/micro/cortexm3/board.c b/cpu/stm32w108/hal/micro/cortexm3/board.c new file mode 100644 index 000000000..d127f0370 --- /dev/null +++ b/cpu/stm32w108/hal/micro/cortexm3/board.c @@ -0,0 +1,453 @@ +/** @file board.c + * @brief Board file x STM32W108 Kits boards + * + * This file implements a software layer to support all the ST kits boards + * and deal with the difference in leds, buttons and sensors connected to the board. + * This a bit too complex for customer boards adaptation and customer can simplify it + * to adapt it to their hardware environment as they normally don't need to have the software + * running on several boards. + * The boards supported are: + * - MB851 A + * - MB851 B + * - MB851 C + * - MB954 A + * - MB954 B + * - MB950 A + * - MB951 A + * + */ +#include PLATFORM_HEADER +#include BOARD_HEADER +#ifdef EMBERZNET_HAL +#include "stack/include/ember.h" +#include "stack/include/error.h" +#include "hal/hal.h" +#define PORTA (0 << 3) +#define PORTB (1 << 3) +#define PORTC (2 << 3) +#else +#include "error.h" +#include "hal/hal.h" +#include "hal/micro/cortexm3/mfg-token.h" +#endif +#include + +const LedResourceType LedsMB851A[] = { + { + "D1", /* Green LED */ + PORTB, + 6 + }, + { + "D3", /* Yellow LED */ + PORTB, + 5 + } +}; + +const InfraRedLedResourceType infraRedLedMB851A = { + "D5", /* Infrared LED */ + PORTB, + 4 +}; + + +const LedResourceType LedsMB954A[] = { + { + "D1", /* Green LED */ + PORTA, + 5 + }, + { + "D3", /* Yellow LED */ + PORTA, + 0 + } +}; + +const ButtonResourceType ButtonsMB851A[] = { + { + "S1", + PORTA, + 7 + } +}; + +const ButtonResourceType ButtonsMB954A[] = { + { + "S1", + PORTB, + 3 + } +}; + +const ButtonResourceType ButtonsMB950A[] = { + { + "S1", + PORTB, + 3 + }, + { + "S2", + PORTA, + 7 + }, + { + "S3", + PORTB, + 7 + }, + { + "S4", + PORTB, + 0 + }, + { + "S5", + PORTB, + 6 + } +}; + +const TempSensorResourceType tempSensorMB851A = { + "STLM20", + PORTB, + 7, + FALSE +}; + +const TempSensorResourceType tempSensorMB954A = { + "STLM20", + PORTA, + 4, + TRUE +}; + +const MemsResourceType memsSensor = { + "LIS302", + 0 +}; + +const BoardIOType ioMB851A = { + LedsMB851A, + ButtonsMB851A, +}; + +const BoardIOType ioMB954A = { + LedsMB954A, + ButtonsMB954A, +}; + +const BoardIOType ioMB950A = { + LedsMB954A, + ButtonsMB950A, +}; + +const BoardResourcesType MB851A = { + "MB851 A", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI), + BUTTONS_MB851A, + LEDS_MB851A, + &ioMB851A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB851A, +}; + +const BoardResourcesType MB851B = { + "MB851 B", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI), + BUTTONS_MB851B, + LEDS_MB851B, + &ioMB851A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB851A, +}; + +const BoardResourcesType MB851C = { + "MB851 C", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F | BOARD_HAS_EEPROM), + BUTTONS_MB851C, + LEDS_MB851C, + &ioMB954A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB954A, +}; + +const BoardResourcesType MB954A = { + "MB954 A", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI | BOARD_HAS_PA), + BUTTONS_MB954A, + LEDS_MB954A, + &ioMB954A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB954A, +}; + +const BoardResourcesType MB954B = { + "MB954 B", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F | BOARD_HAS_EEPROM | BOARD_HAS_PA), + BUTTONS_MB954B, + LEDS_MB954B, + &ioMB954A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB954A, +}; + +const BoardResourcesType MB950A = { + "MB950 A", + (BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F), + BUTTONS_MB950A, + LEDS_MB950A, + &ioMB950A, + &infraRedLedMB851A, + &memsSensor, + &tempSensorMB954A, +}; + +const BoardResourcesType MB951A = { + "MB951 A", + (BOARD_HAS_STM32F), + BUTTONS_MB951A, + LEDS_MB951A, + &ioMB954A, + NULL, + NULL, + NULL, +}; + +static const BoardResourcesType *boardList [] = { + &MB851A, + &MB851B, + &MB851C, + &MB954A, + &MB954B, + &MB950A, + &MB951A +}; + +BoardResourcesType const *boardDescription = NULL; + +#define PORT_NAME(x) ((x == PORTA) ? "A": ((x == PORTB) ? "B" : ((x == PORTC) ? "C": "?"))) + +void halBoardInit(void) +{ + char boardName[16]; + int8s i; + boardDescription = NULL; +#ifdef EMBERZNET_HAL + halCommonGetToken(boardName, TOKEN_MFG_BOARD_NAME); +#else + halCommonGetMfgToken(boardName, TOKEN_MFG_BOARD_NAME); +#endif + + i = 15; + while ((i >= 0) && (boardName[i] == 0xFF)) { + boardName[i] = 0; + i--; + } + + for (i = 0; i < (sizeof(boardList)/4) ; i++) + if (strcmp(boardName, (boardList[i])->name) == 0) { + boardDescription = (BoardResourcesType *) boardList[i]; + break; + } + + if (boardDescription == NULL) { + /* Board type not identified default to MB851A also to support legacy boards */ + boardDescription = (BoardResourcesType *) &MB851A; + } + return; +} +BoardResourcesType const *halBoardGetDescription(void) +{ + return boardDescription; +} + +void halBoardPowerDown(void) +{ + /* Set everything to input value */ + GPIO_PACFGL = (GPIOCFG_IN <io->buttons; + int8u i; + for (i = 0; i < boardDescription->buttons; i++) { + halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD); + halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP); + } + } +#endif + /* Configure GPIO for power amplifier */ + if (boardDescription->flags & BOARD_HAS_PA) { + /* SiGe Standby */ + halGpioConfig(PORTB_PIN(6), GPIOCFG_OUT); + halGpioSet(PORTB_PIN(6), 0); + } + +} +void halBoardPowerUp(void) +{ + /* Set everything to input value */ + GPIO_PACFGL = (GPIOCFG_IN <flags & BOARD_HAS_MEMS) || (boardDescription->flags & BOARD_HAS_EEPROM)) { + halGpioConfig(PORTA_PIN(1), GPIOCFG_OUT_ALT_OD); + halGpioConfig(PORTA_PIN(2), GPIOCFG_OUT_ALT_OD); + } + /* Configure GPIO for ADC access (temp sensor) */ + if (boardDescription->flags & BOARD_HAS_TEMP_SENSOR) { + halGpioConfig(PORTx_PIN(boardDescription->temperatureSensor->gpioPort, + boardDescription->temperatureSensor->gpioPin), + GPIOCFG_ANALOG); + } + /* Configure GPIO for LEDs */ + { + LedResourceType *leds = (LedResourceType *) boardDescription->io->leds; + int8u i; + for (i = 0; i < boardDescription->leds; i++) { + /* LED default off */ + halGpioConfig(PORTx_PIN(leds[i].gpioPort, leds[i].gpioPin), GPIOCFG_OUT); + halGpioSet(PORTx_PIN(leds[i].gpioPort, leds[i].gpioPin), 1); + } + } + /* Configure GPIO for BUTTONSs */ + { + ButtonResourceType *buttons = (ButtonResourceType *) boardDescription->io->buttons; + int8u i; + for (i = 0; i < boardDescription->buttons; i++) { + halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD); + halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP); + } + } + + /* Configure GPIO for power amplifier */ + if (boardDescription->flags & BOARD_HAS_PA) { + /* SiGe Ant Sel (default ceramic antenna) */ + halGpioConfig(PORTB_PIN(5), GPIOCFG_OUT); + halGpioSet(PORTB_PIN(5), 1); + /* SiGe Standby (default out of standby) */ + halGpioConfig(PORTB_PIN(6), GPIOCFG_OUT); + halGpioSet(PORTB_PIN(6), 1); + /* SiGe LNA (default LNA off )*/ + halGpioConfig(PORTB_PIN(7), GPIOCFG_OUT); + halGpioSet(PORTB_PIN(7), 0); + /* SiGe nTX Active */ + halGpioConfig(PORTC_PIN(5), GPIOCFG_OUT_ALT); + } + +} + +#ifdef TEST_COMMANDS +#include +void printLeds (LedResourceType *leds) +{ + while (leds->name != NULL) { + printf ("Led %s (port:%s, bit:%d)\r\n", leds->name, PORT_NAME(leds->gpioPort), leds->gpioPin); + leds++; + } +} + +void printButtons (ButtonResourceType *buttons) +{ + while (buttons->name != NULL) { + printf ("Button %s (port:%s, bit:%d)\r\n", buttons->name, PORT_NAME(buttons->gpioPort), buttons->gpioPin); + buttons++; + } +} + +void boardPrintStringDescription(void) +{ + int8u i = 0; + + while (boardList[i] != NULL) { + if ((boardDescription == boardList[i]) || (boardDescription == NULL)) { + BoardResourcesType *ptr = boardList[i]; + printf ("*************************************\r\n"); + printf ("Board name = %s\r\n", ptr->name); + printf ("*************************************\r\n"); + printLeds(ptr->leds); + printButtons(ptr->buttons); + if (ptr->mems) { + printf ("MEMS = %s\r\n", ptr->mems->name); + } + if (ptr->temperatureSensor) { + printf ("Temp sensor = %s, port:%s, pin:%d, adcFix:%s\r\n", + ptr->temperatureSensor->name, + PORT_NAME(ptr->temperatureSensor->gpioPort), + ptr->temperatureSensor->gpioPin, + ptr->temperatureSensor->adcFix ? "Yes" : "No" + ); + } + printf ("EEProm:%s\r\n", ptr->EEProm ? "Yes" : "No"); + printf ("PC i/f:%s\r\n", ptr->FTDInotSTM32 ? "FTDI" : "STM32F"); + printf ("Power Amplifier:%s\r\n", ptr->PowerAmplifier ? "Yes" : "No"); + } + i++; + } + return NULL; +} +#endif diff --git a/cpu/stm32w108/hal/micro/cortexm3/button.c b/cpu/stm32w108/hal/micro/cortexm3/button.c index 3b8f2297e..0cbae3aab 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/button.c +++ b/cpu/stm32w108/hal/micro/cortexm3/button.c @@ -12,18 +12,25 @@ void halInitButton(void) { - /* Set GPIO pin to PUD (input pull-up or pull-down) for button S1 */ - halGpioConfig(BUTTON_S1,GPIOCFG_IN_PUD); - /* Set the button S1 gpio pin to pull-up */ - BUTTON_S1_OUTPUT_GPIO |= GPIOOUT_PULLUP << BUTTON_S1_GPIO_PIN; + int8u i; + /* Configure GPIO for BUTTONSs */ + ButtonResourceType *buttons = (ButtonResourceType *) boardDescription->io->buttons; + for (i = 0; i < boardDescription->buttons; i++) { + halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD); + halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP); + } }/* end halInitButton() */ int8u halGetButtonStatus(HalBoardButton button) { - if (button == BUTTON_S1) - return (BUTTON_S1_INPUT_GPIO & (1<> 3) & 0xf; + int8u pin = button & 0x7; + + if (button != DUMMY_BUTTON) + { + return (BUTTON_INPUT_GPIO(port) & (1 << pin)) ? BUTTON_RELEASED : BUTTON_PRESSED; + } + return BUTTON_UNKNOWN; }/* end halGetButtonStatus()*/ diff --git a/cpu/stm32w108/hal/micro/cortexm3/compiler/gnu.h b/cpu/stm32w108/hal/micro/cortexm3/compiler/gnu.h index 3030fdeba..2ed3edbf2 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/compiler/gnu.h +++ b/cpu/stm32w108/hal/micro/cortexm3/compiler/gnu.h @@ -22,13 +22,17 @@ #error Improper PLATFORM_HEADER #endif -#define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - -#if GCC_VERSION < 40302 -#error Only GNU C version later than 4.3.2 are supported -#endif +#if (__GNUC__ < 4) + #error Only GNU C versions later than 4.3.2 are supported +#elif (__GNUC__ == 4) + #if (__GNUC_MINOR__ < 3) + #error Only GNU C versions later than 4.3.2 are supported + #elif (__GNUC_MINOR__ == 3) + #if (__GNUC_PATCHLEVEL__ < 2) + #error Only GNU C versions later than 4.3.2 are supported + #endif + #endif +#endif // __GNUC__ #ifndef DOXYGEN_SHOULD_SKIP_THIS @@ -36,6 +40,7 @@ #include #if defined (CORTEXM3_STM32W108) #include "micro/cortexm3/stm32w108/regs.h" + #include "micro/cortexm3/stm32w108/stm32w108_type.h" #else #error Unknown CORTEXM3 micro #endif @@ -169,6 +174,16 @@ typedef unsigned int PointerType; #endif #endif +/** + * @brief Set the application start and end address. + * This are useful to detect whether an image is for bootloader mode or not. + * This can be used also to clone image to another node via bootloader. + */ +#define APPLICATION_IMAGE_START ((u32) &__ApplicationFlashStart) +#define APPLICATION_IMAGE_END ((u32) &__ApplicationFlashEnd) +extern char __ApplicationFlashStart; +extern char __ApplicationFlashEnd; + /** * @brief Macro to reset the watchdog timer. Note: be very very * careful when using this as you can easily get into an infinite loop if you @@ -252,6 +267,9 @@ void halInternalResetWatchDog(void); #define VAR_AT_SEGMENT(__variableDeclaration, __segmentName) \ __variableDeclaration __attribute__ ((section (__segmentName))) +#define ALIGN_VAR(__variableDeclaration, alignment) \ + __variableDeclaration __attribute__ ((aligned(alignment))) + //////////////////////////////////////////////////////////////////////////////// //@} // end of Miscellaneous Macros //////////////////////////////////////////////////////////////////////////////// diff --git a/cpu/stm32w108/hal/micro/cortexm3/compiler/iar.h b/cpu/stm32w108/hal/micro/cortexm3/compiler/iar.h index 796188544..69e4a05b5 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/compiler/iar.h +++ b/cpu/stm32w108/hal/micro/cortexm3/compiler/iar.h @@ -33,6 +33,9 @@ #include #if defined (CORTEXM3_STM32W108) #include "micro/cortexm3/stm32w108/regs.h" + #include "micro/cortexm3/stm32w108/stm32w108_type.h" + #elif defined (CORTEXM3_STM32F103) + #include "stm32f10x.h" #else #error Unknown CORTEXM3 micro #endif @@ -163,6 +166,15 @@ typedef unsigned int PointerType; #endif #endif +/** + * @brief Set the application start and end address. + * This are useful to detect whether an image is for bootloader mode or not. + * This can be used also to clone image to another node via bootloader. + */ +#define APPLICATION_IMAGE_START ((u32) __section_begin("FLASH_IMAGE")) +#define APPLICATION_IMAGE_END ((u32) __section_end ("FLASH_IMAGE")) + + /** * @brief Macro to reset the watchdog timer. Note: be very very * careful when using this as you can easily get into an infinite loop if you @@ -247,6 +259,11 @@ void halInternalResetWatchDog(void); #define VAR_AT_SEGMENT(__variableDeclaration, __segmentName) \ __variableDeclaration @ __segmentName +#define _QUOTEME(a) #a +#define QUOTEME(a) _QUOTEME(a) +#define ALIGN_VAR(__variableDeclaration, alignment) _Pragma(QUOTEME(data_alignment=alignment)) \ + __variableDeclaration + //////////////////////////////////////////////////////////////////////////////// //@} // end of Miscellaneous Macros //////////////////////////////////////////////////////////////////////////////// @@ -290,6 +307,8 @@ void halInternalResetWatchDog(void); #pragma segment=__TEXTRW__ #pragma segment=__FAT__ #pragma segment=__NVM__ +// Special pragma to get the application image start and end address +#pragma segment="FLASH_IMAGE" /**@} */ //A utility function for inserting barrier instructions. These diff --git a/cpu/stm32w108/hal/micro/cortexm3/iap_bootloader.h b/cpu/stm32w108/hal/micro/cortexm3/iap_bootloader.h new file mode 100644 index 000000000..a119a2357 --- /dev/null +++ b/cpu/stm32w108/hal/micro/cortexm3/iap_bootloader.h @@ -0,0 +1,34 @@ +/** @file iap_bootloader.h + * @brief IAP bootloader specific definitions + * + */ + +/** + * @brief Application start address + */ +#define IAP_BOOTLOADER_APPLICATION_ADDRESS 0x08003000 + +/** + * @brief Radio PAN ID for OTA bootloader + */ +#define IAP_BOOTLOADER_PAN_ID 0xb00b + +/** + * @brief Signature used for switch to application + */ +#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d + +/** + * @brief Radio default channel for OTA bootloader + */ +#define IAP_BOOTLOADER_DEFAULT_CHANNEL 0x0F + +/** + * @brief IAP bootloader uart mode + */ +#define IAP_BOOTLOADER_MODE_UART 0 + +/** + * @brief IAP bootloader OTA mode + */ +#define IAP_BOOTLOADER_MODE_OTA 1 diff --git a/cpu/stm32w108/hal/micro/cortexm3/led.c b/cpu/stm32w108/hal/micro/cortexm3/led.c index 9bdb2f0c7..dd0d5f58f 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/led.c +++ b/cpu/stm32w108/hal/micro/cortexm3/led.c @@ -10,12 +10,6 @@ #include "hal/micro/micro-common.h" #include "hal/micro/cortexm3/micro-common.h" -#define GPIO_PxCLR_BASE (GPIO_PACLR_ADDR) -#define GPIO_PxSET_BASE (GPIO_PASET_ADDR) -#define GPIO_PxOUT_BASE (GPIO_PAOUT_ADDR) -// Each port is offset from the previous port by the same amount -#define GPIO_Px_OFFSET (GPIO_PBCFGL_ADDR-GPIO_PACFGL_ADDR) - void halInitLed(void) { /* Set GPIO pins for Led D1 and Led D3 */ @@ -28,16 +22,12 @@ void halInitLed(void) void halSetLed(HalBoardLed led) { - if(led/8 < 3) { - *((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(led/8)))) = BIT(led&7); - } + halGpioSet(led, 0); } void halClearLed(HalBoardLed led) { - if(led/8 < 3) { - *((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(led/8)))) = BIT(led&7); - } + halGpioSet(led, 1); } void halToggleLed(HalBoardLed led) diff --git a/cpu/stm32w108/hal/micro/cortexm3/memmap.h b/cpu/stm32w108/hal/micro/cortexm3/memmap.h index 801cb1290..8feb1b997 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/memmap.h +++ b/cpu/stm32w108/hal/micro/cortexm3/memmap.h @@ -10,6 +10,8 @@ #ifndef LOADER #if defined (CORTEXM3_STM32W108) #include "hal/micro/cortexm3/stm32w108/memmap.h" + #elif defined (CORTEXM3_STM32F103) + #include "hal/micro/cortexm3/stm32f103ret/memmap.h" #else #error no appropriate micro defined #endif diff --git a/cpu/stm32w108/hal/micro/cortexm3/micro-common-internal.c b/cpu/stm32w108/hal/micro/cortexm3/micro-common-internal.c index a0d0537f4..a7cbc5c76 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/micro-common-internal.c +++ b/cpu/stm32w108/hal/micro/cortexm3/micro-common-internal.c @@ -250,7 +250,7 @@ void halInternalSetRegTrim(boolean boostMode) // the accuracy of OSCHF (much lower than XTAL). void halCommonDelayMicroseconds(int16u us) { - int32u beginTime = MAC_TIMER; + int32u beginTime = ReadRegister(MAC_TIMER); //If we're not using the XTAL, the MAC Timer is running off OSCHF, //that means the clock is half speed, 6MHz. We need to halve our delay diff --git a/cpu/stm32w108/hal/micro/cortexm3/micro-common.c b/cpu/stm32w108/hal/micro/cortexm3/micro-common.c index 1afd82c41..965b25c58 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/micro-common.c +++ b/cpu/stm32w108/hal/micro/cortexm3/micro-common.c @@ -9,6 +9,7 @@ #include PLATFORM_HEADER +#include BOARD_HEADER #include "error.h" #include "hal/micro/micro-common.h" #include "hal/micro/cortexm3/micro-common.h" @@ -59,11 +60,16 @@ void halGpioConfig(int32u io, int32u config) *configRegs[io/4] = portcfg | (config <<((io&3)*4)); } - - - - - +void halGpioSet(int32u gpio, boolean value) +{ + if(gpio/8 < 3) { + if (value) { + *((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7); + } else { + *((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7); + } + } +} int16u halInternalStartSystemTimer(void) { diff --git a/cpu/stm32w108/hal/micro/cortexm3/micro-common.h b/cpu/stm32w108/hal/micro/cortexm3/micro-common.h index 1a146df6e..b538e6f08 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/micro-common.h +++ b/cpu/stm32w108/hal/micro/cortexm3/micro-common.h @@ -24,24 +24,35 @@ #endif //__STSTATUS_TYPE__ #endif // DOXYGEN_SHOULD_SKIP_THIS +#define PORTA (0 << 3) +#define PORTB (1 << 3) +#define PORTC (2 << 3) + /** * @brief Some registers and variables require indentifying GPIO by * a single number instead of the port and pin. This macro converts * Port A pins into a single number. */ -#define PORTA_PIN(y) ((0<<3)|y) +#define PORTA_PIN(y) (PORTA|y) /** * @brief Some registers and variables require indentifying GPIO by * a single number instead of the port and pin. This macro converts * Port B pins into a single number. */ -#define PORTB_PIN(y) ((1<<3)|y) +#define PORTB_PIN(y) (PORTB|y) /** * @brief Some registers and variables require indentifying GPIO by * a single number instead of the port and pin. This macro converts * Port C pins into a single number. */ -#define PORTC_PIN(y) ((2<<3)|y) +#define PORTC_PIN(y) (PORTC|y) + +/** + * @brief Some registers and variables require indentifying GPIO by + * a single number instead of the port and pin. This macro converts + * Port C pins into a single number. + */ +#define PORTx_PIN(x, y) (x|y) /** * @brief Resets the watchdog timer. This function is pointed @@ -62,6 +73,16 @@ void halInternalResetWatchDog( void ); */ void halGpioConfig(int32u io, int32u config); +/** + * @brief Set/Clear single GPIO bit + * + * @param io The io pin to use, can be specified with the convenience macros + * PORTA_PIN(), PORTB_PIN(), PORTC_PIN() + * @param value A flag indicating whether to set or clear the io. + * + */ +void halGpioSet(int32u io, boolean value); + /** * @brief Calibrates the internal SlowRC to generate a 1024 Hz (1kHz) clock. diff --git a/cpu/stm32w108/hal/micro/cortexm3/micro.c b/cpu/stm32w108/hal/micro/cortexm3/micro.c index b464ce0ce..34cbf0957 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/micro.c +++ b/cpu/stm32w108/hal/micro/cortexm3/micro.c @@ -6,15 +6,19 @@ */ #include PLATFORM_HEADER +#include BOARD_HEADER #include "error.h" #include "hal/micro/micro-common.h" #include "hal/micro/cortexm3/micro-common.h" #include "micro/system-timer.h" #include "micro/adc.h" +#include "micro/cortexm3/memmap.h" +#include "micro/cortexm3/iap_bootloader.h" #include #include +extern void halBoardInit(void); void halInit(void) { @@ -24,6 +28,7 @@ void halInit(void) //be deleted. GPIO_DBGCFG &= ~GPIO_EXTREGEN; halInternalSetRegTrim(FALSE); + halBoardInit(); halPowerUp(); halInternalCalibrateFastRc(); @@ -54,6 +59,7 @@ void halReboot(void) void halPowerDown(void) { + halBoardPowerDown(); } void halPowerUp(void) @@ -61,6 +67,7 @@ void halPowerUp(void) halInternalInitAdc(); halCommonCalibratePads(); halInternalSwitchToXtal(); + halBoardPowerUp(); } static int16u seed0 = 0xbeef; @@ -106,3 +113,43 @@ void halCommonMemSet(void *dest, int8u val, int16u bytes) { memset(dest, val, bytes); } + +#pragma pack(1) +typedef struct appSwitchStruct { + int32u signature; + int8u mode; + int8u channel; + union { + int16u panID; + int16u offset; + } param; +} appSwitchStructType; +#pragma pack() +static appSwitchStructType *appSwitch = (appSwitchStructType *) RAM_BOTTOM; + +StStatus halBootloaderStart(int8u mode, int8u channel, int16u panID) +{ + if (mode == IAP_BOOTLOADER_MODE_UART) { + int8u cut = *(volatile int8u *) 0x08040798; + if (!( (halFixedAddressTable.baseTable.type == FIXED_ADDRESS_TABLE_TYPE) && + ( ( (halFixedAddressTable.baseTable.version & FAT_MAJOR_VERSION_MASK) + == 0x0000 ) && + (halFixedAddressTable.baseTable.version == 0x0003) //checking presence of valid version + ) && (cut >= 2) && (cut <= 3))) + /* Cut not supported */ + return ST_ERR_FATAL; + } else { + /* Check that OTA bootloader is at the base of the flash */ + if (*((int32u *) (MFB_BOTTOM + 28)) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) { + appSwitch->channel = ((channel >= 11) && (channel <= 26)) ? channel :IAP_BOOTLOADER_DEFAULT_CHANNEL; + appSwitch->param.panID = panID; + } else { + return ST_ERR_FATAL; + } + } + appSwitch->signature = IAP_BOOTLOADER_APP_SWITCH_SIGNATURE; + appSwitch->mode = mode; + halReboot(); + + return (mode <= IAP_BOOTLOADER_MODE_OTA) ? ST_ERR_FATAL: ST_BAD_ARGUMENT; +} diff --git a/cpu/stm32w108/hal/micro/cortexm3/nvm.c b/cpu/stm32w108/hal/micro/cortexm3/nvm.c index 0b14257a5..2aff89c99 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/nvm.c +++ b/cpu/stm32w108/hal/micro/cortexm3/nvm.c @@ -10,6 +10,30 @@ #include PLATFORM_HEADER #include "error.h" + +#ifdef NVM_RAM_EMULATION + +static int16u calibrationData[32+2]={ + 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +int8u halCommonReadFromNvm(void *data, int32u offset, int16u length) +{ + halCommonMemCopy(data, ((int8u *) calibrationData) + offset, length); + return ST_SUCCESS; +} +int8u halCommonWriteToNvm(const void *data, int32u offset, int16u length) +{ + halCommonMemCopy(((int8u *) calibrationData) + offset, data, length); + return ST_SUCCESS; +} + +#else + //flash.h gives access to halInternalFlashErase and halInternalFlashWrite. #include "hal/micro/cortexm3/flash.h" //nvm.h includes memmap.h. These two headers define the key parameters: @@ -375,3 +399,4 @@ int8u halCommonWriteToNvm(const void *data, int32u offset, int16u length) } } +#endif // NVM_RAM_EMULATION diff --git a/cpu/stm32w108/hal/micro/cortexm3/spmr.s79 b/cpu/stm32w108/hal/micro/cortexm3/spmr.s79 index 804282d6d..76360196c 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/spmr.s79 +++ b/cpu/stm32w108/hal/micro/cortexm3/spmr.s79 @@ -99,9 +99,9 @@ _disableBasePri: _basePriIsDisabled: MRS R0, BASEPRI // read current BASEPRI CMP R0, #INTERRUPTS_DISABLED_PRIORITY - ITE le - LDRLE R0, =1 - LDRGT R0, =0 + ITE lt + LDRLT R0, =0 + LDRGE R0, =1 BX LR __CFI__(EndBlock cfiBlock3) diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/board.h b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/board.h index 003cd1ca4..dd9f5d338 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/board.h +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/board.h @@ -1,24 +1,221 @@ /** @file board.h - * @brief Header file x STM32W108 Kits boards + * @brief Header file x STM32W108 Kits boards abstraction. + * See @ref board for documentation. + * + * + * See hal/micro/cortexm3/stm32w108/board.h for source code. * * */ #ifndef _BOARD_H_ #define _BOARD_H_ -#ifdef BOARD_MB851 +/** @addtogroup board + * @brief ST board abstraction layer + * + * This header defines API and data structures to handle ST boards with thei associated resources + * on algorithm behavior. + * See hal/micro/cortexm3/stm32w108/board.h for source code. + *@{ + */ + +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB851A 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB851B 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB851C 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB954A 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB954B 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB950A 2 +/** + * @brief Define the number of LEDs in the specific board revision + */ +#define LEDS_MB951A 2 + +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB851A 1 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB851B 1 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB851C 1 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB954A 1 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB954B 1 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB950A 5 +/** + * @brief Define the number of user buttons in the specific board revision + */ +#define BUTTONS_MB951A 0 + +/** + * @brief Data structure for led description + */ +typedef struct LedResourceStruct { + /** Name of the LED as printed in the board */ + char *name; + /** GPIO port associated with the LED */ + int8u gpioPort; + /** GPIO pin associated with the LED */ + int8u gpioPin; +} LedResourceType; + +typedef LedResourceType InfraRedLedResourceType; + +/** + * @brief Data structure for button description + */ +typedef struct ButtonResourceStruct { + /** Name of the button as printed in the board */ + char *name; + /** GPIO port associated with the button */ + int8u gpioPort; + /** GPIO pin associated with the button */ + int8u gpioPin; +} ButtonResourceType; + +/** + * @brief Data structure for MEMS description + */ +typedef struct MemsResourceStruct { + /** Name of the MEMS device */ + char *name; + /** Serial communication port associated with the MEMS */ + int8u scPort; +} MemsResourceType; + +/** + * @brief Data structure for temperature sensor description + */ +typedef struct TempSensorResourceStruct { + /** Name of the temperature sensor device */ + char *name; + /** GPIO port associated with the sensor */ + int8u gpioPort; + /** GPIO pin associated with the sensor */ + int8u gpioPin; + /** Flag to indicate whether the ADC range extension bug fix is implemented */ + boolean adcFix; +} TempSensorResourceType; + +/** + * @brief Data structure for board user I/O + */ +typedef struct BoardIOStruct { + /** Pointer to LED resources */ + const LedResourceType *leds; + /** Pointer to button resources */ + const ButtonResourceType *buttons; +} BoardIOType; + +/** + * @brief Flag to indicate if MEMS is present + */ +#define BOARD_HAS_MEMS (1 << 0) +/** + * @brief Flag to indicate if temeprature sensor is present + */ +#define BOARD_HAS_TEMP_SENSOR (1 << 1) +/** + * @brief Flag to indicate if external power amplifier is present + */ +#define BOARD_HAS_PA (1 << 2) +/** + * @brief Flag to indicate if EEPROM is present + */ +#define BOARD_HAS_EEPROM (1 << 3) +/** + * @brief Flag to indicate if FTDI is used as PC interface + */ +#define BOARD_HAS_FTDI (1 << 4) +/** + * @brief Flag to indicate if STM32F is used as PC interface + */ +#define BOARD_HAS_STM32F (1 << 5) + +/** + * @brief Data structure describing board features + */ +typedef struct BoardResourcesStruct { + const char *name; + const int32u flags; + /** Number of buttons */ + int8u buttons; + /** Number of leds */ + int8u leds; + /** Board I/O description */ + const BoardIOType *io; + /** Board infrared led description */ + const InfraRedLedResourceType* infraredLed; + /** Board infrared MEMS description */ + const MemsResourceType *mems; + /** Board infrared temeprature sensor description */ + const TempSensorResourceType *temperatureSensor; +} BoardResourcesType; + +extern BoardResourcesType const *boardDescription; + +// Generic definitions +#define GPIO_PxCLR_BASE (GPIO_PACLR_ADDR) +#define GPIO_PxSET_BASE (GPIO_PASET_ADDR) +#define GPIO_PxOUT_BASE (GPIO_PAOUT_ADDR) +#define GPIO_PxIN_BASE (GPIO_PAIN_ADDR) +// Each port is offset from the previous port by the same amount +#define GPIO_Px_OFFSET (GPIO_PBCFGL_ADDR-GPIO_PACFGL_ADDR) + /* leds definitions */ -#define LED_D1 PORTB_PIN(6) -#define LED_D3 PORTB_PIN(5) +#define LED_D1 PORTx_PIN(boardDescription->io->leds[0].gpioPort, boardDescription->io->leds[0].gpioPin) //PORTB_PIN(6) +#define LED_D3 PORTx_PIN(boardDescription->io->leds[1].gpioPort, boardDescription->io->leds[1].gpioPin) // PORTB_PIN(5) +#define DUMMY_LED 0xff /** Description buttons definition */ -#define BUTTON_S1 PORTA_PIN(7) -#define BUTTON_S1_INPUT_GPIO GPIO_PAIN -#define BUTTON_S1_OUTPUT_GPIO GPIO_PAOUT -#define BUTTON_S1_GPIO_PIN PA7_BIT -#define BUTTON_S1_WAKE_SOURCE 0x00000080 +#define BUTTON_Sn(n) (PORTx_PIN(boardDescription->io->buttons[n].gpioPort, boardDescription->io->buttons[n].gpioPin)) +#define BUTTON_Sn_WAKE_SOURCE(n) (1 << ((boardDescription->io->buttons[n].gpioPin) + (8 * (boardDescription->io->buttons[n].gpioPort >> 3)))) +#define BUTTON_INPUT_GPIO(port) *((volatile int32u *) (GPIO_PxIN_BASE + GPIO_Px_OFFSET * port)) +#define DUMMY_BUTTON 0xff + +#define BUTTON_S1 (boardDescription->buttons>0 ? BUTTON_Sn(0): DUMMY_BUTTON) +#define BUTTON_S2 (boardDescription->buttons>1 ? BUTTON_Sn(1): DUMMY_BUTTON) +#define BUTTON_S3 (boardDescription->buttons>2 ? BUTTON_Sn(2): DUMMY_BUTTON) +#define BUTTON_S4 (boardDescription->buttons>3 ? BUTTON_Sn(3): DUMMY_BUTTON) +#define BUTTON_S5 (boardDescription->buttons>4 ? BUTTON_Sn(4): DUMMY_BUTTON) + +#define BUTTON_S1_WAKE_SOURCE (boardDescription->buttons>0 ? BUTTON_Sn_WAKE_SOURCE(0): 0) +#define BUTTON_S2_WAKE_SOURCE (boardDescription->buttons>1 ? BUTTON_Sn_WAKE_SOURCE(1): 0) +#define BUTTON_S3_WAKE_SOURCE (boardDescription->buttons>2 ? BUTTON_Sn_WAKE_SOURCE(2): 0) +#define BUTTON_S4_WAKE_SOURCE (boardDescription->buttons>3 ? BUTTON_Sn_WAKE_SOURCE(3): 0) +#define BUTTON_S5_WAKE_SOURCE (boardDescription->buttons>4 ? BUTTON_Sn_WAKE_SOURCE(4): 0) /** Description uart definition */ #define UART_TX PORTB_PIN(1) @@ -26,8 +223,37 @@ #define UART_RX_WAKE_SOURCE 0x00000400 /** Description temperature sensor GPIO */ -#define TEMPERATURE_SENSOR_GPIO PORTB_PIN(7) -#endif /* BOARD_MB851 */ +#define TEMPERATURE_SENSOR_GPIO PORTx_PIN(boardDescription->temperatureSensor->gpioPort, boardDescription->temperatureSensor->gpioPin) // PORTB_PIN(7) + +/** @brief Return pointer to board description structure + * + * + * @return Pointer to board description structure + */ +BoardResourcesType const *halBoardGetDescription(void); +/** + * @brief Initialize the board description data structure after + * autodetect of the boards based on the CIB Board name field + * content. In case of invalid CIB data it will default to MB851A. + * Customer normally needs to modify this file to adapt it to their specific board. + */ +void halBoardInit(void); +/** + * @brief Perform board specific action to power up the system. + * This code depends on the actual board features and configure + * the stm32w and on board devices for proper operation. + * Customer normally needs to modify this file to adapt it to their specific board. + */ +void halBoardPowerUp(void); +/** + * @brief Perform board specific action to power down the system, usually before going to deep sleep. + * This code depends on the actual board features and configure + * the stm32w and on board devices for minimal power consumption. + * Customer normally needs to modify this file to adapt it to their specific board. + */ +void halBoardPowerDown(void); #endif /* _BOARD_H_ */ +/** @} // END addtogroup + */ diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt_stm32w108.c b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt_stm32w108.c index 6be646583..4807c28ec 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt_stm32w108.c +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt_stm32w108.c @@ -20,8 +20,8 @@ #include #include #define RESERVED 0 -//#define DUMMY_MALLOC - +#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d +#define IAP_BOOTLOADER_MODE_UART 0 /* Includes ----------------------------------------------------------------------*/ #include PLATFORM_HEADER void NMI_Handler(void); @@ -72,7 +72,7 @@ VAR_AT_SEGMENT(const HalFixedAddressTableType halFixedAddressTable, __FAT__); /* function prototypes ------------------------------------------------------*/ void Reset_Handler(void) __attribute__((__interrupt__)); extern int main(void); - +extern void halInternalSwitchToXtal(void); /****************************************************************************** * @@ -121,6 +121,20 @@ void (* const g_pfnVectors[])(void) = halDebugIsr, // 32 }; +static void setStackPointer(int32u address) __attribute__((noinline)); +static void setStackPointer(int32u address) +{ + // This code is needed to generate the instruction below + // that GNU ASM is refusing to add + // asm("MOVS SP, r0"); + asm(".short 0x4685"); +} + +static const int16u blOffset[] = { + 0x0715 - 0x03ad - 0x68, + 0x0719 - 0x03ad - 0x6C +}; + /******************************************************************************* * Function Name : Reset_Handler * Description : This is the code that gets called when the processor first starts execution @@ -244,6 +258,21 @@ void Reset_Handler(void) while(1) { ; } } + //USART bootloader software activation check + if ((*((int32u *)RAM_BOTTOM) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) && (*((int8u *)(RAM_BOTTOM+4)) == IAP_BOOTLOADER_MODE_UART)){ + int8u cut = *(volatile int8u *) 0x08040798; + int16u offset = 0; + typedef void (*EntryPoint)(void); + offset = (halFixedAddressTable.baseTable.version == 3) ? blOffset[cut - 2] : 0; + *((int32u *)RAM_BOTTOM) = 0; + if (offset) { + halInternalSwitchToXtal(); + } + EntryPoint entryPoint = (EntryPoint)(*(int32u *)(FIB_BOTTOM+4) - offset); + setStackPointer(*(int32u *)FIB_BOTTOM); + entryPoint(); + } + INTERRUPTS_OFF(); asm("CPSIE i"); @@ -302,12 +331,10 @@ caddr_t _sbrk ( int incr ) return (caddr_t) prev_heap; } #else -# ifdef DUMMY_MALLOC caddr_t _sbrk ( int incr ) { return NULL; } -# endif #endif int _lseek (int file, int ptr, diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/gnu.ld b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/gnu.ld index ad7042027..ed63358a9 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/gnu.ld +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/gnu.ld @@ -13,71 +13,65 @@ GROUP( These are used by the startup in order to allocate stacks for the different modes. */ -__Stack_Size = 0x500 ; +__Stack_Size = 0x400 ; PROVIDE ( _Stack_Size = __Stack_Size ) ; -__Stack_Init = _estack - __Stack_Size ; +__Stack_Init = 0x20000000; + +_estack = __Stack_Init + __Stack_Size; + /*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/ PROVIDE ( _Stack_Init = __Stack_Init ) ; -/* -There will be a link error if there is not this amount of RAM free at the end. -*/ -_Minimum_Stack_Size = 0x500 ; - /* this sends all unreferenced IRQHandlers to reset */ -PROVIDE(Default_Handler = 0 ); -PROVIDE(NMI_Handler = Default_Handler ); -PROVIDE(HardFault_Handler = Default_Handler ); -PROVIDE(MemManage_Handler = Default_Handler ); -PROVIDE(BusFault_Handler = Default_Handler ); -PROVIDE(UsageFault_Handler = Default_Handler ); -PROVIDE(SVC_Handler = Default_Handler ); -PROVIDE(DebugMonitor_Handler = Default_Handler ); -PROVIDE(PendSV_Handler = Default_Handler ); -PROVIDE(SysTick_Handler = Default_Handler ); -PROVIDE(halTimer1Isr = Default_Handler ); -PROVIDE(halTimer2Isr = Default_Handler ); -PROVIDE(halManagementIsr = Default_Handler ); -PROVIDE(halBaseBandIsr = Default_Handler ); -PROVIDE(halSleepTimerIsr = Default_Handler ); -PROVIDE(halSc1Isr = Default_Handler ); -PROVIDE(halSc2Isr = Default_Handler ); -PROVIDE(halSecurityIsr = Default_Handler ); -PROVIDE(halStackMacTimerIsr = Default_Handler ); -PROVIDE(stmRadioTransmitIsr = Default_Handler ); -PROVIDE(stmRadioReceiveIsr = Default_Handler ); -PROVIDE(halAdcIsr = Default_Handler ); -PROVIDE(halIrqAIsr = Default_Handler ); -PROVIDE(halIrqBIsr = Default_Handler ); -PROVIDE(halIrqCIsr = Default_Handler ); -PROVIDE(halIrqDIsr = Default_Handler ); -PROVIDE(halDebugIsr = Default_Handler ); -/*PROVIDE(stSerialPrintf = printf );*/ +PROVIDE(NMI_Handler = 0 ); +PROVIDE(HardFault_Handler = 0 ); +PROVIDE(MemManage_Handler = 0 ); +PROVIDE(BusFault_Handler = 0 ); +PROVIDE(UsageFault_Handler = 0 ); +PROVIDE(SVC_Handler = 0 ); +PROVIDE(DebugMonitor_Handler = 0 ); +PROVIDE(PendSV_Handler = 0 ); +PROVIDE(SysTick_Handler = 0 ); +PROVIDE(halTimer1Isr = 0 ); +PROVIDE(halTimer2Isr = 0 ); +PROVIDE(halManagementIsr = 0 ); +PROVIDE(halBaseBandIsr = 0 ); +PROVIDE(halSleepTimerIsr = 0 ); +PROVIDE(halSc1Isr = 0 ); +PROVIDE(halSc2Isr = 0 ); +PROVIDE(halSecurityIsr = 0 ); +PROVIDE(halStackMacTimerIsr = 0 ); +PROVIDE(stmRadioTransmitIsr = 0 ); +PROVIDE(stmRadioReceiveIsr = 0 ); +PROVIDE(halAdcIsr = 0 ); +PROVIDE(halIrqAIsr = 0 ); +PROVIDE(halIrqBIsr = 0 ); +PROVIDE(halIrqCIsr = 0 ); +PROVIDE(halIrqDIsr = 0 ); +PROVIDE(halDebugIsr = 0 ); /******************************************************************************/ /* Peripheral memory map */ /******************************************************************************/ /*this allows to compile the ST lib in "non-debug" mode*/ - - +_BOOTLOADER_SIZE = 0x3000 ; +_ROM_base = DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000 ; /* include the memory spaces definitions sub-script */ MEMORY { RAM_region (xrw) : ORIGIN = 0x20000000, LENGTH = 8K - ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-3K - NVM_region (rx) : ORIGIN = 0x0801F400, LENGTH = 3K + ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-2K + NVM_region (rx) : ORIGIN = 0x0801F800, LENGTH = 2K FIB_region (ra) : ORIGIN = 0x08040000, LENGTH = 2K } -/* higher address of the user mode stack */ -_estack = 0x20002000; /* Sections management for FLASH mode */ @@ -87,9 +81,12 @@ SECTIONS { /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */ - .isr_vector : + + .isr_vector (DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000) : { . = ALIGN(4); + __ApplicationFlashStart = . ; + /* . = . + _ROM_base ;*/ KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >ROM_region @@ -113,24 +110,12 @@ SECTIONS *(.rodata*) *(.glue_7) *(.glue_7t) - . = ALIGN(1024); - *(.elf_text) - . = ALIGN(1024); - /*. = ALIGN(4);*/ + + . = ALIGN(4); _etext = .; - /* This is used by the startup in order to initialize the .data section */ + /* This is used by the startup in order to initialize the .data secion */ _sidata = _etext; } >ROM_region - - .coffee 0x08010000 : - { - _coffee_start = ABSOLUTE(.); - . = ALIGN(1024); - *(.coffeefiles) - . = ORIGIN(NVM_region) - _coffee_start; - } > ROM_region = 0x00 - - NVM (NOLOAD): { . = ALIGN(1024); @@ -146,6 +131,12 @@ SECTIONS . = ALIGN(4); } > FIB_region +/* + .FAT (NOLOAD): + { + KEEP(*(.FAT)) + } > FIB_region +*/ /* after that it's only debugging information. */ @@ -153,10 +144,10 @@ SECTIONS The program executes knowing that the data is in the RAM but the loader puts the initial values in the FLASH (inidata). It is one task of the startup to copy the initial values from FLASH to RAM. */ - .data : AT ( _sidata ) + .data _estack : AT ( _sidata ) { . = ALIGN(4); - /* This is used by the startup in order to initialize the .data section */ + /* This is used by the startup in order to initialize the .data secion */ _sdata = . ; *(.data) @@ -165,9 +156,9 @@ SECTIONS . = ALIGN(4); /* This is used by the startup in order to initialize the .data secion */ _edata = . ; - ASSERT(_sidata + SIZEOF(.data) < LOADADDR(.coffee), ".data section overflow in ROM"); } >RAM_region + /* This is the uninitialized data section */ .bss : @@ -177,6 +168,7 @@ SECTIONS _sbss = .; *(.bss) + *(.bss.*) *(COMMON) . = ALIGN(4); @@ -186,21 +178,6 @@ SECTIONS PROVIDE ( end = _ebss ); PROVIDE ( _end = _ebss ); - - /* This is the user stack section - This is just to check that there is enough RAM left for the User mode stack - It should generate an error if it's full. - */ - ._usrstack : - { - . = ALIGN(4); - _susrstack = . ; - - . = . + _Minimum_Stack_Size ; - - . = ALIGN(4); - _eusrstack = . ; - } >RAM_region __exidx_start = .; __exidx_end = .; @@ -247,3 +224,5 @@ SECTIONS .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } } + +__ApplicationFlashEnd = _sidata + (_edata - _sdata); diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg.icf b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg.icf index 74124aac2..d8ed9ee43 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg.icf +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg.icf @@ -1,13 +1,21 @@ + +if( isdefinedsymbol(ST_BTL) ) { +define symbol __ICFEDIT_intvec_start__ = 0x08003000; +define symbol __ICFEDIT_region_ROM_start__ = 0x08003000; +} else { define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +} + +/*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; define symbol __ICFEDIT_region_FIB_start__ = 0x08040000; define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x500; +define symbol __ICFEDIT_size_cstack__ = 0x400; + define memory mem with size = 4G; @@ -15,16 +23,17 @@ define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFED define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ; initialize by copy { readwrite }; do not initialize { section .noinit, section FAT, section NVM }; -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - place at address mem:__ICFEDIT_region_FIB_start__ { section FAT }; -place in ROM_region { readonly }; +place in ROM_region { block FLASH_IMAGE }; + place at end of ROM_region { section NVM }; place in RAM_region { readwrite, block CSTACK }; + diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/low_level_init.c b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/low_level_init.c index 1ab3d3324..790ef608e 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/low_level_init.c +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/low_level_init.c @@ -31,10 +31,24 @@ extern "C" { __root __no_init const HalFixedAddressTableType halFixedAddressTable @ __FAT__; extern const HalVectorTableType __vector_table[]; +extern void halInternalSwitchToXtal(void); +#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d +#define IAP_BOOTLOADER_MODE_UART 0 __interwork int __low_level_init(void); +static void setStackPointer(int32u address) +{ + asm("MOVS SP, r0"); +} + +static const int16u blOffset[] = { + 0x0715 - 0x03ad - 0x68, + 0x0719 - 0x03ad - 0x6C +}; + + __interwork int __low_level_init(void) { //Ensure there is enough margin on VREG_1V8 for stable RAM reads by @@ -154,6 +168,21 @@ __interwork int __low_level_init(void) while(1) { ; } } + //USART bootloader software activation check + if ((*((int32u *)RAM_BOTTOM) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) && (*((int8u *)(RAM_BOTTOM+4)) == IAP_BOOTLOADER_MODE_UART)){ + int8u cut = *(volatile int8u *) 0x08040798; + int16u offset = 0; + typedef void (*EntryPoint)(void); + offset = (halFixedAddressTable.baseTable.version == 3) ? blOffset[cut - 2] : 0; + *((int32u *)RAM_BOTTOM) = 0; + if (offset) { + halInternalSwitchToXtal(); + } + EntryPoint entryPoint = (EntryPoint)(*(int32u *)(FIB_BOTTOM+4) - offset); + setStackPointer(*(int32u *)FIB_BOTTOM); + entryPoint(); + } + INTERRUPTS_OFF(); asm("CPSIE i"); diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/regs.h b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/regs.h index 31ab3b216..aa0572be2 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/regs.h +++ b/cpu/stm32w108/hal/micro/cortexm3/stm32w108/regs.h @@ -2,6 +2,9 @@ #define __REGS_H__ 1 +#define ReadRegister(a) a +#define WriteRegister(a, b) a = b + /* FLASH_BASE block */ #define DATA_FLASH_BASE_BASE (0x00000000u) #define DATA_FLASH_BASE_END (0x0001FFFFu) diff --git a/cpu/stm32w108/hal/micro/cortexm3/temperature_sensor.c b/cpu/stm32w108/hal/micro/cortexm3/temperature_sensor.c index d8958abe8..dfc212ac4 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/temperature_sensor.c +++ b/cpu/stm32w108/hal/micro/cortexm3/temperature_sensor.c @@ -29,18 +29,17 @@ void temperatureSensor_Init(void) #endif /* ENABLE_ADC_EXTENDED_RANGE_BROKEN */ }/* end temperatureSensor_Init() */ -int32u temperatureSensor_GetValue(int8u type) +int32u temperatureSensor_GetValue(void) { static int16u ADCvalue; static int16s volts; - /* - NOTE: - The ADC extended range is inaccurate due to the high voltage mode bug of the general purpose ADC - (see STM32W108 errata). As consequence, it is not reccomended to use this ADC driver for getting - the temperature values. - */ -#ifdef ENABLE_ADC_EXTENDED_RANGE_BROKEN + /* + NOTE: + The ADC extended range is inaccurate due to the high voltage mode bug of the general purpose ADC + (see STM32W108 errata). As consequence, it is not reccomended to use this ADC driver for getting + the temperature values. + */ halStartAdcConversion(ADC_USER_APP, ADC_REF_INT, ADC_SOURCE_ADC2_VREF2, ADC_CONVERSION_TIME_US_4096); halReadAdcBlocking(ADC_USER_APP, &ADCvalue); // This blocks for a while, about 4ms. @@ -49,6 +48,5 @@ int32u temperatureSensor_GetValue(int8u type) volts = halConvertValueToVolts(ADCvalue); return ((18641 - (int32s)volts)*100)/1171; -#endif /* ENABLE_ADC_EXTENDED_RANGE_BROKEN */ }/* end temperatureSensor_GetValue() */ diff --git a/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h b/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h index c823c2d86..3e939cf0f 100644 --- a/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h +++ b/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h @@ -135,18 +135,6 @@ int8s halCommonMemCompare(const void *source0, const void *source1, int8u bytes); - /** - * @brief Works like C stdlib memcmp(), but takes a flash space source - * parameter. - */ - int8s halCommonMemPGMCompare(const void *source0, void PGM *source1, int8u bytes); - - /** - * @brief Same as the C stdlib memcpy(), but handles copying from const - * program space. - */ - void halCommonMemPGMCopy(void* dest, void PGM *source, int8u bytes); - /** * @brief Friendly convenience macro pointing to the full HAL function. */ diff --git a/cpu/stm32w108/hal/micro/led.h b/cpu/stm32w108/hal/micro/led.h index b0bd24a0d..f6dcd0cc9 100644 --- a/cpu/stm32w108/hal/micro/led.h +++ b/cpu/stm32w108/hal/micro/led.h @@ -49,16 +49,9 @@ void halSetLed(HalBoardLed led); */ void halClearLed(HalBoardLed led); -/** @brief Called by the stack to indicate activity over the radio (for - * both transmission and reception). It is called once with \c turnOn TRUE and - * shortly thereafter with \c turnOn FALSE. - * - * Typically does something interesting, such as change the state of - * an LED. - * - * @param turnOn See Usage. - */ -void halStackIndicateActivity(boolean turnOn); +#ifdef CORTEXM3_STM32F103 +#include "micro/cortexm3/stm32f103ret/led-specific.h" +#endif /** @} // END addtogroup */ diff --git a/cpu/stm32w108/hal/micro/micro-common.h b/cpu/stm32w108/hal/micro/micro-common.h index d187f4fd1..db4895361 100644 --- a/cpu/stm32w108/hal/micro/micro-common.h +++ b/cpu/stm32w108/hal/micro/micro-common.h @@ -15,6 +15,15 @@ #ifndef __MICRO_COMMON_H__ #define __MICRO_COMMON_H__ +#ifndef DOXYGEN_SHOULD_SKIP_THIS +#ifndef __STSTATUS_TYPE__ +#define __STSTATUS_TYPE__ + //This is necessary here because halSleepForQsWithOptions returns an + //StStatus and not adding this typedef to this file breaks a + //whole lot of builds. + typedef int8u StStatus; +#endif //__STSTATUS_TYPE__ +#endif // DOXYGEN_SHOULD_SKIP_THIS /** @brief Initializes microcontroller-specific peripherals. */ @@ -109,6 +118,28 @@ enum */ void halCommonDelayMicroseconds(int16u us); +/** @brief Request the appplication to enter in bootloader mode + * + * This function will check whwther the user flash contains the bootloader + * and if yes it will jump into it according to the user parameters. + * + * + * @param mode The bootloader mode, 0 UART mode, 1 RF mode. All other + * values are reserved + * @param channel The channel where the booloader will operate. 0 means + * default channel (only vaild for RF mode). + * @param panID The panID where the booloader will operate. 0xFFFF means + * default panID (only vaild for RF mode). + * @return An error code or it will never return. + */ +StStatus halBootloaderStart(int8u mode, int8u channel, int16u panId); + +#ifdef CORTEXM3_STM32F103 +#include "micro/cortexm3/stm32f103ret/micro-specific.h" +#endif +#ifdef CORTEXM3_STM32W108 +#include "micro/cortexm3/micro-common.h" +#endif #endif //__MICRO_COMMON_H__ diff --git a/cpu/stm32w108/hal/micro/system-timer.h b/cpu/stm32w108/hal/micro/system-timer.h index 0d4ba9591..3b18651ac 100644 --- a/cpu/stm32w108/hal/micro/system-timer.h +++ b/cpu/stm32w108/hal/micro/system-timer.h @@ -48,9 +48,9 @@ int16u halInternalStartSystemTimer(void); * @return The least significant 16 bits of the current system time, in system * ticks. */ -//#pragma pagezero_on // place this function in zero-page memory for xap +#pragma pagezero_on // place this function in zero-page memory for xap int16u halCommonGetInt16uMillisecondTick(void); -//#pragma pagezero_off +#pragma pagezero_off /** * @brief Returns the current system time in system ticks, as a 32-bit diff --git a/cpu/stm32w108/hal/micro/temperature_sensor.h b/cpu/stm32w108/hal/micro/temperature_sensor.h index 073bfc0ce..49aec4d86 100644 --- a/cpu/stm32w108/hal/micro/temperature_sensor.h +++ b/cpu/stm32w108/hal/micro/temperature_sensor.h @@ -21,7 +21,7 @@ void temperatureSensor_Init(void); /** @brief Get temperature sensor value */ -int32u temperatureSensor_GetValue(int8u type); +int32u temperatureSensor_GetValue(void); #endif /* _TEMP_SENSOR_H_ */ diff --git a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf b/cpu/stm32w108/iar-cfg-coffee.icf similarity index 76% rename from cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf rename to cpu/stm32w108/iar-cfg-coffee.icf index 02531fe92..60f739572 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf +++ b/cpu/stm32w108/iar-cfg-coffee.icf @@ -1,10 +1,17 @@ + +if( isdefinedsymbol(ST_BTL) ) { +define symbol __ICFEDIT_intvec_start__ = 0x08003000; +define symbol __ICFEDIT_region_ROM_start__ = 0x08003000; +} else { define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; -define symbol __ICFEDIT_region_CFS_start__ = 0x08010000; /* Reserved for contiki flash file system. COFFEE_ADDRESS must be changed also in cfs-coffee-arch.h */ +} + +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; +define symbol __ICFEDIT_region_CFS_start__ = 0x08010c00; /* Reserved for contiki flash file system. COFFEE_ADDRESS must be changed also in cfs-coffee-arch.h */ define symbol __ICFEDIT_region_CFS_end__ = 0x0801F3FF; -define symbol __ICFEDIT_region_NVM_start__ = 0x0801F400; +define symbol __ICFEDIT_region_NVM_start__ = 0x0801F800; define symbol __ICFEDIT_region_NVM_end__ = 0x0801FFFF; define symbol __ICFEDIT_region_FIB_start__ = 0x08040000; define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF; @@ -14,6 +21,7 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; define symbol __ICFEDIT_size_cstack__ = 0x500; + define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region CFS_region = mem:[from __ICFEDIT_region_CFS_start__ to __ICFEDIT_region_CFS_end__]; @@ -21,17 +29,17 @@ define region NVM_region = mem:[from __ICFEDIT_region_NVM_start__ to __ICFED define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ; initialize by copy { readwrite }; do not initialize { section .noinit, section FAT, section NVM }; -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - place at address mem:__ICFEDIT_region_FIB_start__ { section FAT }; -place in ROM_region { readonly }; +place in ROM_region { block FLASH_IMAGE }; place in CFS_region { section .coffeefiles }; place in NVM_region { section NVM }; place in RAM_region { readwrite, block CSTACK }; + diff --git a/cpu/stm32w108/iar-cfg.icf b/cpu/stm32w108/iar-cfg.icf new file mode 100644 index 000000000..46e67a7a3 --- /dev/null +++ b/cpu/stm32w108/iar-cfg.icf @@ -0,0 +1,39 @@ + +if( isdefinedsymbol(ST_BTL) ) { +define symbol __ICFEDIT_intvec_start__ = 0x08003000; +define symbol __ICFEDIT_region_ROM_start__ = 0x08003000; +} else { +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +} + +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; +define symbol __ICFEDIT_region_FIB_start__ = 0x08040000; +define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x500; + + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ; + +initialize by copy { readwrite }; +do not initialize { section .noinit, + section FAT, + section NVM }; + +place at address mem:__ICFEDIT_region_FIB_start__ { section FAT }; +place in ROM_region { block FLASH_IMAGE }; + +place at end of ROM_region { section NVM }; +place in RAM_region { readwrite, + block CSTACK }; + diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio_intonly_thumb2.a b/cpu/stm32w108/lib/e_stdio_intonly_thumb2.a similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio_intonly_thumb2.a rename to cpu/stm32w108/lib/e_stdio_intonly_thumb2.a diff --git a/cpu/stm32w108/hal/micro/cortexm3/e_stdio_thumb2.a b/cpu/stm32w108/lib/e_stdio_thumb2.a similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/e_stdio_thumb2.a rename to cpu/stm32w108/lib/e_stdio_thumb2.a diff --git a/cpu/stm32w108/hal/micro/cortexm3/smallprintf_thumb2.a b/cpu/stm32w108/lib/smallprintf_thumb2.a similarity index 100% rename from cpu/stm32w108/hal/micro/cortexm3/smallprintf_thumb2.a rename to cpu/stm32w108/lib/smallprintf_thumb2.a diff --git a/cpu/stm32w108/simplemac/include/phy-library.h b/cpu/stm32w108/simplemac/include/phy-library.h index 7739811b7..ca21a83e6 100644 --- a/cpu/stm32w108/simplemac/include/phy-library.h +++ b/cpu/stm32w108/simplemac/include/phy-library.h @@ -5,7 +5,6 @@ * */ -#include "stm32w108_type.h" //--------------------------------------------------------------------------- // Definitions @@ -30,7 +29,7 @@ /** * @brief Version patch number */ -#define SIMPLEMAC_VERSION_PATCH 0 +#define SIMPLEMAC_VERSION_PATCH 2 /** * @brief Version qualifier diff --git a/cpu/stm32w108/simplemac/library/simplemac-library-gnu.a b/cpu/stm32w108/simplemac/library/simplemac-library-gnu.a new file mode 100644 index 0000000000000000000000000000000000000000..0c18ab6c3290bcaf84125f39bec76da466340b1a GIT binary patch literal 166656 zcmdqK31C&#oj-ogdoRg-NeBrbgs{CVKokfGpdy0gp6~gdeZA*?Z{gbLNKfBInae|oreekFl`GD>VATZ`p-{Q<^8SWGt5#gF z+78i`DTMfx5P8QZ+p}i~L3_cMY`ZB}2->aH|26xudxiM#w6Da4NU}1&QYgE$S4i6W zxNCQ23rTzB-v1}9FMWpif6$J`cellQ#zy+%`!+^LdasC%#Oen7;{x=Cp=fV?Y+v1A zd?+$B5+kWC9v$or4-5^)Y6g2o_6^6Y28Mce(Pu*}4&K_4q1}cz92?b4^rz68vHtT` z*^+yr0}j>}hjhfUa>W=uYh&@AJ{PST8j24fC9#plXwSwN9SyO;o$)^MwnlsVhuUJX z-d3b*XtzUZjg7|Q;lbXT!D#nDtTomX>))d?fMh~Ud;jj(h{GJ|i}mbMk{l8vZRy+B zHXQ5e-_hUW&=K5@scCF?cWh)->==pejR`ti*VsXlL_;t)9wPZu##m7b` z`E7{y4~pSv&o0Q`>xAChq9}@cZ=^L+8|@!R4q7*AXJT*jp4iBafuSqNP&e2!v>T~8 zQ)#uL2-{*K{n3He*iJ{{7BqmEmyDdY?`;{n0>wVm%M7WkqqHM^(ZRtO(_$!!3pg^b zO3~n^cH(Z3WD=^Vc4(w07Ksk@caKEl{X>HgWUyFdY-A)h=n2pAO-NN^EIK+i65HI{ z+otocl8_vulcdc(L*cRbQ2Q8LFxy5i;0Q> zFe@xP5O3Yl5=E07W`QXVCtUZ?(5RE>=w2r}H*@? zymfT6zkR62t$#FURl!N!v}Q0ivU6W`EFSC8&C`zDZa%su8lxDq&`g|2lIY28O$SCx z4BNw}YPD>cz&*?ygJSNuX`_*$p%IKXQ4E`m55(%&p8lR#-Dsi@GSq~=Tc@%JF%H6< zMh6|b<5r2VW7h*$WW=ppm*hzx3Tq_ZJ`x=q-Hp*NJ`#(nK{$cjj_JZF7(1*Pu$qSA z9A8bxw@Wsarzc8JD%*BoC>un^Qb{~#ZYn*rxNSmmrFIJRkJrf5=Cp+GBmO)Ix;ji*eha_NN$tg65SQ+7Od*0|TD;kY3Cp@Myvei;;4G-E%JrR?SkqPB=Hn zsMu*{$f{`1uAv<}oajvaX42x!ZD?YIn3{)mi)-Am6ElLIdUo5G;f@UL9v(n{)S>J- zB30Kl0qO=@Muv8(5ffSR4kZ|Ld!pfZJhpo{uCixR?VZ;}TYIN!bm%wsqQwyGwqX_& zOc$0<4to;aG$a!k4JnDk35kf3z0`D@7<F;ES}q6x7kuBu!~iDR#!r|3nl zS9H>V?T);FUbcZ zjA{{P@G+y6)Bj9R!{Ef?te%pVy(WNXpJGU?W_v}KY9(#BkbJWsHY7Ko6TLlU7zWNK zj+dG$mM0&BBp!-P!YacNz95WkbtdAA2o2iHybP zBpTL}%X*_dljvAM8rpE*zGc`4?H(HRQq(46WS=2LVmm?^@Xr+foHbb&X4Op>BB1FOgxF3Y(xt4MF5#I`DC(v!&l19#iqK>a zmWlP*cId^~d2*Vp#L-h`nM@+4Gjvv(6ORum$X+G9jBt#B^7#;+fiXb|r z43e9LtW87q^ISUeJp_tR!|ENIP z?*aUW>E2FJzCZ?kMIeyYKNuHjfsFKWpjW|W^y6o$umU6m`Xy}6F3dJkp=?@H7lJ062Jq{Rea+qispf6vI!@}8lQcx>

(~3Q2>FAdg_mzBTu``R5x}yF1g6eY}uM> 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 diff --git a/cpu/stm32w108/simplemac/library/simplemac-library.a b/cpu/stm32w108/simplemac/library/simplemac-library.a index c7e2de988baefa37c6643c4df14c32c4926d8453..b79d83a159fb7b7c86af36311088f1210c54b6cd 100644 GIT binary patch literal 98640 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

mR$GOtb!QzJQXE89e&!90jf;SomQ&j} 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 R^SuT;`rZfe?NZjn_aF9iNR0ph literal 132816 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 )V8uloAIeu3BO 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